第1章 音视频同步基础

1.1 什么是音视频同步

音视频同步,说白了就是让画面和声音对上嘴。

你想想看,看电视的时候,演员嘴巴在动,声音却慢了半拍。或者画面已经切到下一个场景了,上一句台词还在响。这就是不同步。

从技术角度讲,音视频同步是指音频流和视频流在时间轴上的对齐。我们通常用唇音同步(Lip Sync)这个词来衡量。标准是什么?

行业公认的容忍范围:

  • 音频领先视频:不超过 100ms
  • 音频落后视频:不超过 200ms
  • 超出这个范围,人眼就能察觉

我在项目中遇到过,有些用户对延迟特别敏感。尤其是看演唱会或者新闻直播,50ms 的偏差都能被投诉。嗯,这其实跟个人感知能力有关,但作为工程师,我们得按最严苛的标准来。

1.2 为什么需要同步

这个问题看似简单,但背后有门道。

首先,用户体验是第一位的。你花几千块买个机顶盒,结果看个电视剧音画不同步,这产品还能用吗?

其次,不同步会带来认知负担。人的大脑会试图把声音和画面强行对齐,时间长了会头晕、疲劳。我有个朋友做测试,连续看不同步的视频半小时,直接恶心到吐。这不是夸张,是真事。

最后,从商业角度看,音视频同步是机顶盒的及格线。连这个都做不好,其他功能再强也没用。

我的经验:在项目验收时,音视频同步测试永远是第一项。如果这关过不了,连提测的资格都没有。

1.3 同步的挑战

做音视频同步,难在哪?我总结了三座大山。

1.3.1 网络抖动

网络不是一条平稳的高速公路。它更像乡间小路,坑坑洼洼。

数据包到达的时间不均匀,这叫抖动。有时候一包数据早到了,有时候晚到了,甚至丢了。你想想看,视频帧和音频采样点本来就是交错到达的,网络一抖,顺序全乱了。

我曾经在一个项目中,用户用的是无线网络。信号稍微不好,抖动能达到 500ms 以上。这种情况下,不做缓冲和抗抖动处理,画面根本没法看。

注意:网络抖动不是延迟。延迟是固定的,抖动是变化的。处理抖动比处理延迟麻烦得多。

1.3.2 解码延迟

解码器不是瞬间工作的。它需要时间。

视频解码通常比音频解码慢。为什么呢?因为视频帧的数据量大,压缩算法复杂。H.264 解码一帧可能花 10ms,而 AAC 音频解码一帧可能只要 1ms。

更麻烦的是,解码时间不是固定的。I 帧(关键帧)解码慢,P 帧和 B 帧解码快。这就导致了解码输出的节奏不稳定。

我记得有一次调试,发现视频总是比音频慢 80ms。查了半天,原来是解码器的输出队列设置不合理。调整之后,问题就解决了。

1.3.3 渲染延迟

解码完了,不等于能显示出来。

视频渲染需要经过显示驱动、帧缓冲、屏幕刷新。音频渲染需要经过混音器、音频驱动、DAC 转换。每个环节都有延迟。

举个例子,显示器的刷新率是 60Hz,每帧的显示周期是 16.67ms。如果你刚好错过了一个刷新周期,就得等下一个。这一等,就是 16ms 的额外延迟。

音频也有类似的问题。音频输出缓冲区的大小直接影响延迟。缓冲区越大,延迟越高,但抗抖动的能力越强。这是个 trade-off。

关键数据:

环节 典型延迟 影响因素
网络缓冲 50-500ms 网络质量、缓冲区大小
视频解码 5-30ms/帧 编码格式、分辨率、硬件
音频解码 1-5ms/帧 编码格式、采样率
视频渲染 16-50ms 刷新率、帧缓冲
音频渲染 10-100ms 缓冲区大小、驱动

1.4 同步的基本原理

说了这么多问题,那怎么解决呢?

核心思路只有一个:找一个共同的时钟参考

音频和视频各自有独立的时间戳。音频帧上有 PTS(显示时间戳),视频帧上也有 PTS。同步就是让这两个时间戳对齐。

具体做法是:

  1. 选择一个主时钟,通常是音频时钟
  2. 视频根据音频时钟来调整自己的播放节奏
  3. 如果视频快了,就等一等
  4. 如果视频慢了,就跳帧或者加速

为什么选音频做主时钟?因为人耳对声音的抖动更敏感。画面稍微卡一下,用户可能注意不到。但声音一卡,立刻就能察觉。

避坑指南:我曾经在项目里用系统时钟做主时钟,结果发现音频和视频的时钟漂移不一样。跑了半小时,偏差越来越大。后来老老实实改用音频时钟,问题就解决了。

1.5 本章小结

音视频同步,说白了就是让声音和画面对齐。说起来简单,做起来难。

网络抖动、解码延迟、渲染延迟,这三个问题不解决,同步就是空谈。但好消息是,业界已经有成熟的方案。后面几章,我会一步步带你实现一个完整的同步算法。

记住一句话:同步不是精确到毫秒,而是让用户感觉不到不同步

下一章,我们聊聊时间戳的管理。这是同步的基础,也是很多人容易踩坑的地方。