Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MediaCodec在genymotion和huddle 2上使用不同颜色_Android_Colors_Android Mediacodec_Renderscript_Yuv - Fatal编程技术网

Android MediaCodec在genymotion和huddle 2上使用不同颜色

Android MediaCodec在genymotion和huddle 2上使用不同颜色,android,colors,android-mediacodec,renderscript,yuv,Android,Colors,Android Mediacodec,Renderscript,Yuv,我的目标: 使用渲染脚本对来自SD卡的MP4视频使用过滤器(裁剪、黑白、边缘检测) 尝试的解决方案 -使用MediaCodec直接输出到曲面。 渲染的颜色是正确的,但我找不到一种方法一次处理每个帧以使用renderscript应用过滤器 -从渲染脚本复制解码的缓冲区,并使用ScriptIntrinsicYuvToRGB将其转换为RGB 我不能使用ScriptIntrinsicYuvToRGB,因为它假定传入的YUV数据的格式与传入数据的格式不同。() -从渲染脚本复制解码的缓冲区,并使用自定义代

我的目标:
使用渲染脚本对来自SD卡的MP4视频使用过滤器(裁剪、黑白、边缘检测)

尝试的解决方案
-使用MediaCodec直接输出到曲面。
渲染的颜色是正确的,但我找不到一种方法一次处理每个帧以使用renderscript应用过滤器

-从渲染脚本复制解码的缓冲区,并使用ScriptIntrinsicYuvToRGB将其转换为RGB
我不能使用ScriptIntrinsicYuvToRGB,因为它假定传入的YUV数据的格式与传入数据的格式不同。()

-从渲染脚本复制解码的缓冲区,并使用自定义代码转换为RGB
我当前的解决方案使用非常类似的代码将YUV转换为RGB(感谢@Derzu)

因为后者效果更好

我的问题
在我的Huddle 2上,颜色看起来还行,但在Genymotion JellyBean模拟器上,颜色完全错了

拥挤的2

基因运动

你能给我一些帮助和建议吗?

非常感谢您

您需要检查它实际使用的颜色格式-这假设输出是NV12,但看起来您的输出是I420或类似的东西(平面,而不是半平面)。特别是,请看一下(checkFrame方法)

关键因素是:

int colorFormat = format.getInteger(MediaFormat.KEY_COLOR_FORMAT);
checkFrame
方法还向您展示了如果它是平面而不是半平面,如何处理它,这应该适用于您的情况


请记住,设备也可以以专有格式输出,但您无法将其解释为如此简单-您需要准备好以某种方式处理这种情况(例如,告诉用户您的应用程序无法处理它,退回到其他基于软件的实现,等等).

您需要检查它实际使用的颜色格式-这假设输出是NV12,但看起来您的输出是I420或类似的东西(平面,而不是半平面)。特别是,请看一下(checkFrame方法)

关键因素是:

int colorFormat = format.getInteger(MediaFormat.KEY_COLOR_FORMAT);
checkFrame
方法还向您展示了如果它是平面而不是半平面,如何处理它,这应该适用于您的情况


请记住,设备也可以以专有格式输出,但您无法将其解释为如此简单-您需要准备好以某种方式处理这种情况(例如,告诉用户您的应用程序无法处理它,退回到其他基于软件的实现,等等).

您需要检查它实际使用的颜色格式-这假设输出是NV12,但看起来您的输出是I420或类似的东西(平面,而不是半平面)。特别是,请看一下(checkFrame方法)

关键因素是:

int colorFormat = format.getInteger(MediaFormat.KEY_COLOR_FORMAT);
checkFrame
方法还向您展示了如果它是平面而不是半平面,如何处理它,这应该适用于您的情况


请记住,设备也可以以专有格式输出,但您无法将其解释为如此简单-您需要准备好以某种方式处理这种情况(例如,告诉用户您的应用程序无法处理它,退回到其他基于软件的实现,等等).

您需要检查它实际使用的颜色格式-这假设输出是NV12,但看起来您的输出是I420或类似的东西(平面,而不是半平面)。特别是,请看一下(checkFrame方法)

关键因素是:

int colorFormat = format.getInteger(MediaFormat.KEY_COLOR_FORMAT);
checkFrame
方法还向您展示了如果它是平面而不是半平面,如何处理它,这应该适用于您的情况


请记住,设备也可以以专有格式输出,但您无法将其解释为如此简单-您需要准备好以某种方式处理这种情况(例如,告诉用户您的应用程序无法处理它,退回到其他基于软件的实现,等等).

如果您的过滤器相对简单,您可以使用GLES着色器编写它们,例如。否则,最好是使用GLES在屏幕外渲染曲面以进行颜色转换,然后使用
glReadPixels()
将其读回。AFAIK renderscript转换仅适用于相机输出,即YV12或NV21,MediaCodec均不使用这两种格式。如果过滤器相对简单,则可以使用GLES着色器编写它们,例如。否则,最好是使用GLES在屏幕外渲染曲面以进行颜色转换,然后使用
glReadPixels()
将其读回。AFAIK renderscript转换仅适用于相机输出,即YV12或NV21,MediaCodec均不使用这两种格式。如果过滤器相对简单,则可以使用GLES着色器编写它们,例如。否则,最好是使用GLES在屏幕外渲染曲面以进行颜色转换,然后使用
glReadPixels()
将其读回。AFAIK renderscript转换仅适用于相机输出,即YV12或NV21,MediaCodec均不使用这两种格式。如果过滤器相对简单,则可以使用GLES着色器编写它们,例如。否则,最好是使用GLES在屏幕外渲染曲面以进行颜色转换,然后使用
glReadPixels()
将其读回。AFAIK renderscript转换仅适用于相机输出,即YV12或NV21,MediaCodec均不使用这两种格式。