MediaCodec中的presentationTimeUs有什么用途?

9

队列输入缓冲 (int index, int offset, int size, long presentationTimeUs, int flags)中,presentationTimeUs的官方定义如下:

这个缓冲区的呈现时间戳,以微秒为单位。通常,这是应呈现(渲染)该缓冲区的媒体时间。

如果由应用程序确定何时呈现解码后的图像,为什么解码器需要presentationTimeUs?我曾尝试使用一些任意的presentationTimeUs值,并没有看到解码有所不同。例如,如果我将presentationTimeUs的原始值加倍,则视频似乎与原始视频相同速度解码。

是否有人能够解释一下这种情况?

1个回答

2
解码器需要知道输入缓冲区的时间戳,有多个原因。
首先,如果流中有B帧,则重新排序缓冲区并将正确的时间戳分配给缓冲区是由解码器执行的。因此,当在输入缓冲区上接收到时间戳时,同样会排队进行重新排序。
其次,如果使用场景类似于Android-TV,实际上具有tunneled video playback,则时间戳视频解码器消耗,该解码器被tunneled到底层HW块以进行同步和渲染。
最后,如果有任何数据包或帧的丢失,则解码器可以在观察到时间戳突然跳跃而没有调用刷新时,可能执行某种掩盖。这不是一种常见情况,但是是某些解码器的高级功能。
在传统情况下,正如您所指出的那样,同步是由播放器引擎执行的,在其中解码器将输入缓冲区时间戳反映到输出缓冲区。

1
非常感谢您的回答,让我受益匪浅。在使用dequeueOutputBuffer方法返回的MediaCodec.BufferInfo中,presentationTimeUs字段应该被尊重。 - Hong
2
你好,当我从原始数据(pcm/wav)编码为AAC时,presentationTimeUs是什么意思?谢谢! - ch271828n
在上行/编码路径中,您正在对连续数据进行编码。因此,帧的时间应该线性增加。例如:如果帧大小为20毫秒,则帧的时间戳应为0、20、40、60...当解码时,这将是用于呈现的“presentationTimeUs”。希望这可以帮助到您。 - Ganesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接