-
音频时钟同步:以音频播放速度为准
-
视频时钟同步:以视频显示节奏为准
-
外部时钟同步:以系统/墙钟/统一时间轴为准
三种同步基准的区别
1)音频为基准(audio master)
这是最常见、也最自然的方式。
原因很简单:
-
音频设备一旦开始播放,声卡会按固定采样率持续吐数据
-
人耳对音频卡顿、爆音、断续非常敏感
-
视频帧"早一点晚一点显示"一般比音频异常更容易接受
所以音频时钟通常最稳定。
做法
-
音频时钟持续前进,作为主时钟
-
视频根据音频时钟决定:
-
该不该显示下一帧
-
要不要等一会儿再显示
-
落后太多时要不要丢帧追赶
-
特点
-
音频平滑
-
视频可能会:
-
微调显示间隔
-
偶尔丢帧
-
偶尔重复帧
-
适用
-
普通播放器
-
本地文件播放
-
大多数 ffplay / VLC / 常规播放器思路
2)视频为基准(video master)
就是以视频帧时间轴为准,音频去追视频。
这个一般不如音频主时钟常见,但在一些场景里会用:
-
视频是核心,比如监控、转码、录像切片
-
视频时间戳更可信
-
你希望"画面节奏"绝对正确
-
音频只是附属
做法
-
视频帧的 pts/dts 或视频显示时间作为主时钟
-
音频根据视频主时钟判断自己快了还是慢了
-
然后对音频做补偿:
-
小偏差:重采样,轻微变速
-
大偏差:丢样本/补静音/跳跃校正
-
特点
-
视频更稳定
-
音频可能会被"拉伸"或"压缩"
-
如果补偿过猛,可能听出音调/节奏异常
适用
-
以视频输出为核心的链路
-
某些录像合成、TS 复用、监控流处理
-
视频时间戳明确,音频时间戳不太可靠时
3)外部时钟为基准(external master)
就是不用音频也不用视频本身当主时钟,而是用一个"外部统一时间"。
比如:
-
系统单调时钟
-
网络同步时钟
-
实时采集时间
-
某个设备统一时基
做法
-
音频、视频都去对齐外部时钟
-
谁快谁慢都按外部时钟来修
特点
-
适合实时系统、直播、会议、监控
-
多路流、跨设备同步更方便
-
实现复杂度更高
适用
-
实时直播
-
摄像头采集
-
网络传输
-
多设备协同系统
三者的核心区别,一句话理解
-
音频主时钟:视频去追音频
-
视频主时钟:音频去追视频
-
外部主时钟:音视频都去追外部时间
三、为什么"以视频为基准"时常常要对音频做重采样补偿
因为音频不是一帧一帧"显示"的,它是连续输出的。
比如 AAC 48kHz:
-
声卡按 48000 samples/s 播
-
但视频主时钟可能要求:
-
这一小段音频应该稍微快一点
-
或者稍微慢一点
-
-
如果你仍然死板地按 48000 播,时间一长就会和视频越差越远
所以就要做:
轻微速度调整
比如把实际播放效果从:
- 48000 Hz
微调成:
-
47980 Hz
-
48020 Hz
这就叫重采样补偿。
注意:
这里通常不是改编码参数里的 nominal sample_rate,
而是通过 resampler 让输出样本数略多或略少,从而实现"慢一点"或"快一点"的播放效果。