我正在使用/Verify/
库创建一个非常基本的视频播放器,我已经完成了所有解码和重新编码,但我仍然坚持音频视频同步。
我的问题是,电影有音频和视频流复用(交织在一起)的方式,音频和视频以“突发”(一些音频数据包,然后是并置的视频帧),像这样,每个数据包都有自己的时间戳:
ffmpeg
据说可以防止在没有视频的情况下处理过多的音频,反之亦然。
现在我必须解码“爆发”并及时将它们发送到音频/视频播放组件,我在细节上有点迷失。
因为我不期待这样的事情:
A A A A A A A A V V V V A A A A A A A V V V V ...
A: decoded and re-encoded audio data chunk
V: decoded and re-encoded video frame
或者这个:
AAAAAAAAAAA .... AAAAAAAAAAAAA x10000 VVVVVVVVVVVVVV x1000
audio for the whole clip followed by video
发生在一个编码良好的视频中(毕竟,防止这种极端情况是多路复用的......)
谢谢!
更新:由于我的描述可能一直不清楚,问题不在于流是如何解码的,也不在于如何解码它们:整个音频/视频解复用,解码,重新缩放和重新编码设置和声音,每个数据块都有自己的时间戳。
我的问题是如何处理解码数据而不会导致缓冲区溢出和欠载,并且通常会堵塞我的管道,所以我猜它可能被认为是“调度”问题。
答案 0 :(得分:2)
同步是容器的工作。每帧将加上PTS / DTS或持续时间/ CTS
的时间戳答案 1 :(得分:2)
我会详细说明@szatmary的答案,我已正确地将其标记为正确,但我没有立即认出它。
请注意,这是我接受的答案,我并不是暗示他的意图,也许他的意思完全不同......
经过一番沉思,我得出结论
同步是容器的工作。
可以解释为“不要浪费太多时间进行噱头来安排音频和视频帧,因为容器以易于消费的方式呈现数据”。 / p>
为了证明这一点,我调查了几个视频流,发现音频和视频数据“爆发”的方式允许这种方法:
这是因为:
其他一切只是一个“微不足道的编码问题”;-)