【问题标题】:How to know the YUV color-format of a camera on an android device when i need to output a video with MediaCodec?当我需要使用 MediaCodec 输出视频时,如何知道 Android 设备上相机的 YUV 颜色格式?
【发布时间】:2016-09-26 07:29:07
【问题描述】:

当我尝试使用 android MediaCodec 输出 h.264 视频时遇到问题。我从 onPreviewFrame 获取帧数据,然后将其提供给 MediaCodec,并使用 OpenGL 在 GLSurfaceView 上绘制帧。它可以在某些设备和操作系统版本上正常运行,例如带有 5.0 系统的三星 s5、带有 5.1 系统的三星 note4 和一些 android 4.4 设备。

但是当我尝试在其他设备上运行此应用程序时,例如带有 android 6.0 的三星 s6、带有 android 6.0 和 5.0 设备的三星 note5,出现了问题。我在 GLSurfaceView 上绘制的图像是正确且正常的,但我弄错了似乎没有颜色或颜色错误的视频。

我试图找到答案,我终于意识到这可能是由 MediaCodec 接受的颜色格式的差异引起的。在我的程序中,我假设 mediaCodec 可以接受 YUV420SP,所以我将 nv21 i420SemiPlanar 转换并提供给 MediaCodec .我猜mediaCodec的颜色格式是解决问题的关键,但这是真的吗?为什么不同设备和操作系统版本上的mediaCodec会有如此大的差异?

有人遇到同样的问题吗?

我可以做些什么来避免这个问题?

【问题讨论】:

    标签: android


    【解决方案1】:

    首先,我对这个平台有点失望,因为它仍然有用且很酷。我不知道为什么我的问题得到了-2分。我展示了我的研究和我对这个问题的了解,你们怎么会认为它不清楚且没有用?

    我找到了MediaCodec在输出视频文件时失去颜色的原因。

    我们在初始化相机时设置的 NV21 格式的 Android 相机输出帧。但是不同设备(或不同版本的android系统?)上的MediaCodec可能支持不同的颜色格式。所以如果我们只使用静态颜色格式参数来初始化MediaCodec,MediaCodec就会崩溃。

    关于颜色缺失的问题,是我的失误造成的。我循环MediaCodec的MediaCodecInfo.CodecCapabilities捕捉支持的颜色格式,并使用第一个识别的颜色格式来初始化mediaCodec。它不会崩溃,但它可能与我们准备提供给 MediaCodec 的帧的颜色格式不匹配。

    Android相机可能只支持NV21,所以无论你在得到预览帧的时候想做什么,你必须设计一个匹配NV21格式的程序。

    现在没有错。我希望我的愚蠢错误可以帮助任何人遇到同样的问题。

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 2014-12-12
      • 1970-01-01
      • 2019-07-06
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 2019-04-04
      相关资源
      最近更新 更多