【问题标题】:Playback: audio-video synchronization algorithm播放:音视频同步算法
【发布时间】:2016-08-07 22:37:03
【问题描述】:

我正在使用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

据说是为了防止在没有视频的情况下处理太多音频,反之亦然

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

  1. 是否有“标准”策略/范式/模式来应对此类问题?
  2. 是否有解释使用技术的教程/文档/书籍?
  3. 在一部编码良好的电影中,多路复用能走多远?

因为我不期待这样的事情:

AAAAAAAAAAA .... AAAAAAAAAAAAA x10000 VVVVVVVVVVVVVV x1000
audio for the whole clip followed by video

或者这个:

VVVVVVVVVVVV x1000 AAAAAAAAAAA...AAAAAAAAA x1000    
all video frames followed by the audio

发生在编码良好的视频中(毕竟,防止这种极端情况是复用的全部意义所在......)

谢谢!

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

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

【问题讨论】:

  • 你解决了这个问题我有一个类似的问题试图同步多个流我有他们的时间戳,它的相对经过时间。
  • @Teocci 我没有,我只是暂时搁置了这个问题,我会再次解决手动 A/V 解码问题,抱歉!

标签: audio video ffmpeg playback


【解决方案1】:

同步是容器的工作。每帧都将带有 PTS/DTS 或持续时间/CTS 的时间戳

【讨论】:

  • 谢谢你的回答,@szatmary,但我不确定我们说的是同一件事。我已经有了每个帧和音频块的时间戳,我的问题是如何设置一个管道来读取未指定数量的音频/视频数据包而不会阻塞或滞后。我需要多少缓冲(如果有)?有首选方法吗?这种东西...... [顺便说一句,我已经更新了我的问题以使其更清楚]
  • 另外,我会发私信给你,但在 stackexchange 网络上是不可能的:我检查了你的简历(顺便祝贺你的职业生涯),链接 szatmary.org 似乎坏了.想你可能会感兴趣。
【解决方案2】:

我将详细说明@szatmary 的答案,我已经正确地将其标记为正确,尽管我没有立即认识到它。

请注意,这是我对他的回答的看法,我并没有暗示他的意图,也许他的意思完全不同......

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

同步是容器的工作。

可以解释为“不要浪费太多时间来安排音频和视频帧,因为容器已经以易于使用的方式呈现数据”

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

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

之所以有效,是因为:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多