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均不使用这两种格式。