播放:音视频同步算法

时间:2016-08-06 12:36:41

标签: audio video ffmpeg playback

我正在使用/Verify/库创建一个非常基本的视频播放器,我已经完成了所有解码和重新编码,但我仍然坚持音频视频同步。

我的问题是,电影有音频和视频流复用(交织在一起)的方式,音频和视频以“突发”(一些音频数据包,然后是并置的视频帧),像这样,每个数据包都有自己的时间戳

ffmpeg

据说可以防止在没有视频的情况下处理过多的音频,反之亦然

现在我必须解码“爆发”并及时将它们发送到音频/视频播放组件,我在细节上有点迷失。

  1. 是否有“标准”战略/范式/模式来应对这类问题?
  2. 是否有关于解释使用技巧的教程/文档/书籍?
  3. muxing在编码良好的电影中能走多远?
  4. 因为我不期待这样的事情:

    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
    

    发生在一个编码良好的视频中(毕竟,防止这种极端情况是多路复用的......)

    谢谢!

    更新:由于我的描述可能一直不清楚,问题不在于流是如何解码的,也不在于如何解码它们:整个音频/视频解复用,解码,重新缩放和重新编码设置和声音,每个数据块都有自己的时间戳。

    我的问题是如何处理解码数据而不会导致缓冲区溢出和欠载,并且通常会堵塞我的管道,所以我猜它可能被认为是“调度”问题。

2 个答案:

答案 0 :(得分:2)

同步是容器的工作。每帧将加上PTS / DTS或持续时间/ CTS

的时间戳

答案 1 :(得分:2)

我会详细说明@szatmary的答案,我已正确地将其标记为正确,但我没有立即认出它。

请注意,这是我接受的答案,我并不是暗示他的意图,也许他的意思完全不同......

经过一番沉思,我得出结论

  

同步是容器的工作。

可以解释为“不要浪费太多时间进行噱头来安排音频和视频帧,因为容器以易于消费的方式呈现数据”。 / p>

为了证明这一点,我调查了几个视频流,发现音频和视频数据“爆发”的方式允许这种方法:

  1. 解码并保存所有音频数据,并且不要太担心它会有多少:没有足够的音频来减慢视频处理速度,或者溢出“合理”的缓冲区,以获得足够的音量数据合理(这并不意味着我不采取预防措施)。
  2. 对每个视频帧进行解码,然后等待它呈现它
  3. 这是因为:

    • 突发中的音频数据量足够小,不会占用太多内存或CPU时间,因此可以在帧之间进行解码,即使它包含多个帧的周期
    • 音频和视频“突发”(分别为样本和帧)排序很好,这意味着突发样本所涵盖的时段几乎涵盖了下一帧帧的周期。

    其他一切只是一个“微不足道的编码问题”;-)