releaseOutputBuffer用于不同的分辨率

时间:2015-01-28 18:09:33

标签: android android-ndk mp4 mediacodec

我使用Android NDK MediaCodec API解码不同分辨率的MP4流。

我使用内置功能渲染到曲面,调用AMediaCodec_releaseOutputBuffer并将render标志设置为true。

我发现每次分辨率改变时,旧分辨率的几帧都会在新分辨率大小的表面上输出。它可能看起来像是为了提升分辨率:

+------------------+-------------+
| frame of old res |             |
| displayed too    |             |
| small            |             |
+------------------+             |
|                                |
|      size of new resolution    |
+--------------------------------+

几帧后,视频再次显示正常。我怀疑当输入缓冲区以新分辨率排队时,而不是当该分辨率的第一个输出缓冲区出列时,它与表面大小的变化有关。

之前有没有人遇到过这个问题?

2 个答案:

答案 0 :(得分:2)

感谢您的帮助。

我在MediaCodec documentation中找到了以下内容:

  

对于某些视频格式,也可以在中途更改图片大小。要为H.264执行此操作,必须将新的序列参数集(SPS)和图片参数集(PPS)值与瞬时解码器刷新(IDR)帧一起打包在一个缓冲区中,然后可以将其作为常规排队输入缓冲区。客户端将在发生图片大小更改之后以及返回任何具有新大小的帧之前从dequeueOutputBuffer()或onOutputBufferAvailable()接收INFO_OUTPUT_FORMAT_CHANGED返回值。

每当我收到一个新的SPS和PPS时,我确保不要立即将它们传递给解码器,而是将它们添加到下一个I帧。

这解决了问题 - 解决方案的变化是无缝的:)

答案 1 :(得分:0)

此特定解码器是否表示支持MediaCodecInfo.CodecCapabilities.FEATURE_AdaptivePlayback

我自己没有遇到过这个问题(因为我没有尝试解码改变分辨率的流),但据我所知,这个功能标志被引入以表示对此用例的正确处理。如果你在带有这个功能标志的解码器上看到这种行为,我会认为这是一个错误(或者我没有正确理解这个功能标志的实际含义)。