PresentationTimeUs对MediaCodec有什么用?

时间:2015-05-30 04:09:44

标签: android mediacodec

queueInputBuffer (int index, int offset, int size, long presentationTimeUs, int flags)中presentationTime的官方定义如下:

  

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

为什么解码器需要这个,如果它是应用程序何时呈现解码图像?我已经为presentationTimeUs尝试了一些任意数字,它们似乎对解码没有任何影响。例如,如果我将presentationTimeU的原始值加倍,则视频的解码方式与原始视频的解码速度完全相同。

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:2)

由于多种原因,decoder需要知道输入缓冲区的timestamps

首先,如果流有B-frames,则timestamps执行缓冲区的重新排序并将正确的decoder分配给缓冲区。因此,当在输入缓冲区上收到timestamps时,相同的队列将进行重新排序。

其次,如果用例类似于Android-TV,而tunneled video playback实际上有timestampvideo decoder会消耗HW 隧道到底层decoder块以进行同步和渲染。

最后,如果数据包或框架出现任何下降,timestamps如果在decoder中观察到突然跳转而没有刷新,则可能会执行某种隐藏被召唤。这不是常态,但是是一些解码器的高级功能。

在传统情况下,正如您所指出的,同步由播放器引擎执行,其中window.innerWidth应将输入缓冲时间戳反映到输出缓冲区。