【问题标题】:Decoding hd video with libstagefright results in garbled video使用 libstagefright 解码高清视频会导致视频乱码
【发布时间】:2015-11-21 10:07:49
【问题描述】:

我正在使用 libstagefright 解码一个 1020p 视频,该视频在 android 上具有高基线和 31 级。

在模拟器上视频解码失败,我认为原因是softavc根据代码here不支持高基线

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

但是视频结果是乱码。

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

【问题讨论】:

    标签: android android-ndk decoding stagefright


    【解决方案1】:

    输出乱码可能有3个原因

    1. 解码器使用stride,您尚未将其计入计算中。 推荐解决方案:请查看OMXcomponent的port参数,寻找stride并进行适当修改。

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

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

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

    【讨论】:

    • 经过大量研究,我发现实际问题可能是我使用的是 mpegts 流,并且它没有在 extradata 中设置 sps 和 pps。因此ffm​​peg的libstagefright.cpp无法解码。
    • 经过更多研究,我发现您的评估是正确的。我的问题确实是颜色格式。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 2020-03-28
      • 2012-07-04
      • 2020-09-25
      相关资源
      最近更新 更多