queueInputBuffer (int index, int offset, int size, long presentationTimeUs, int flags)中presentationTime的官方定义如下:
此缓冲区的显示时间戳(以微秒为单位)。这是 通常是应该呈现此缓冲区的媒体时间 (渲染)。
为什么解码器需要这个,如果它是应用程序何时呈现解码图像?我已经为presentationTimeUs尝试了一些任意数字,它们似乎对解码没有任何影响。例如,如果我将presentationTimeU的原始值加倍,则视频的解码方式与原始视频的解码速度完全相同。
有人可以对此有所了解吗?
答案 0 :(得分:2)
由于多种原因,decoder
需要知道输入缓冲区的timestamps
。
首先,如果流有B-frames
,则timestamps
执行缓冲区的重新排序并将正确的decoder
分配给缓冲区。因此,当在输入缓冲区上收到timestamps
时,相同的队列将进行重新排序。
其次,如果用例类似于Android-TV
,而tunneled video playback
实际上有timestamp
,video decoder
会消耗HW
隧道到底层decoder
块以进行同步和渲染。
最后,如果数据包或框架出现任何下降,timestamps
如果在decoder
中观察到突然跳转而没有刷新,则可能会执行某种隐藏被召唤。这不是常态,但是是一些解码器的高级功能。
在传统情况下,正如您所指出的,同步由播放器引擎执行,其中window.innerWidth
应将输入缓冲时间戳反映到输出缓冲区。