将专门的 NV12 视频帧转换为 RGB

Converting specialized NV12 video frames to RGB

我有一个使用 Android MediaCodec 解码的 H264 流。当我查询输出 MediaFormat 时,颜色格式为 2141391875。显然,这是一个专门的 NV12 变体,称为 HAL_PIXEL_FORMAT_NV12_ADRENO_TILED。这是在 Nexus 7 (2013) 上。

我想获取此数据并将其转换为 RGB,以便创建位图。我找到了将其他格式转换为 RGB 的 Whosebug 帖子,而不是这种格式。我试过其他帖子中的代码,结果只是颜色条纹。 (为了查看位图,我在与 Surface 相关联的 Canvas 上绘制,并将其写为 JPEG——两种情况下看起来都一样。)

如何将此特定数据转换为 RGB?

2141391875 十进制是十六进制的 0x7FA30C03,根据 this header fileOMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka。这与您发现的常数相同:这是专有的 Qualcomm 颜色格式。

最简单(也是最快)的转换方法是让 OpenGL ES 为您完成工作。参见示例 ExtractMpegFramesTest,它将视频帧解码为 SurfaceTexture,将纹理渲染到屏幕外表面,然后使用 glReadPixels() 读取像素。 GLES 驱动程序将为您处理 RGB 转换。

如果您想自己进行转换,则需要对颜色格式进行逆向工程,或者找已经做过并愿意分享的人。