使用 libstagefright 解码高清视频导致视频乱码

Decoding hd video with libstagefright results in garbled video

我正在使用 libstagefright 解码 android 上具有高基线和级别 31 的 1020p 视频。

在模拟器上视频解码失败,我认为原因是根据代码 here

softavc 不支持高基线

但我在使用 OMX.MTK.VIDEO.DECODER.AVC 解码器的真实设备上测试了这段代码。并且根据这个link,这个解码器支持31级的高基线解码。

但是视频结果是乱码

有没有人有任何见解,为什么会这样?可能的解决方案是什么?

输出乱码可能有3个原因

  1. 解码器使用了一个 stride,您没有将其纳入计算。 推荐解决方案:请检查OMX组件的port参数,寻找stride并进行适当的修改。

  2. 我假设你正在解码 1080,请考虑 1088 计算 而不是 of 1080。如果您的输出清晰 luma,但混乱 chroma,则可以确认这一点。 720p 适合你吗?

  3. 如果以上两个条件都不成立,则解码器可能输出tiled输出。请检查供应商的规格。如果这是真的,您将需要从 tiled 格式转换为更常见的格式,如 NV12

编辑: 我认为 tiling 是你的问题。请查看与您的问题相关且有颜色转换解决方案的this github commit

我假设你正在拍摄分辨率为 1920 x 1080 的视频。建议将解码缓冲区的宽度和高度分别对齐到最接近的 128 和 32 的倍数,以避免输出乱码。

ALIGN(decoded_buffer_width, 128)
ALIGN(decoded_buffer_height, 32)

所以您必须使用 1920 x 1088 进行计算