音视频同步问题解释之前先需要了解几个基本的音视频的概念:

  • pts 渲染时间戳(Presentation TimeStamp)
  • dts 解码时间戳 (Decode TimeStamp)
  • fps 每秒显示的帧数(Frame Per Second):帧率

# 音频解码

音频解码是顺序解码,所以音频的 PTS 和 DTS 是一样的,当前解码的帧就是当前需要显示的帧。

# 视频解码

在视频解码中,由于采用了双向预测的帧间压缩技术,视频帧的解码顺序和视频帧的显示顺序就不一样了。
举个简单的例子:
有 1,2,3 这三张顺序显示的图片,第 1 张图片不依赖其他图片进行解码;第二张图片依赖第一张和第三张图片进行解码;第三张图片依赖第一张图片进行解码。

如果按照 1->2->3 的顺序解码,那么由于 2 需要 1 和 3 进行解码,那么 2 就会解码失败。
所以为了成功的对 1,2,3 都进行解码,就应该按照下面的顺序进行解码:1->3->2, 这个顺序就是 dts 的顺序。

# 音视频同步问题

# 1. 音频播放速度异常

可能原因:
1.1 音频播放器采样率参数设置错误
如果设置的采样率大于真实采用率,那么音频播放速度会比正常速度快;如果设置的采样率小于真实采样率,那么音频播放速度会比正常速度慢。

1.2 音频解码速度太快,没有做同步,需要根据真实世界时钟速度进行同步解码

# 2. 视频播放速度异常

可能原因:
2.1 视频解码速度太快,没有进行音视频同步或者音视频同步出错。

# 音视频同步策略

音视频同步策略有三种:

  • 以视频 pts 为准进行同步
  • 以音频 pts 为基准进行同步
  • 以真实世界时钟速度进行同步

常用第二种和第三种同步策略,为什么不使用第一种,是因为人的感观是对音频信号比视频画面更敏感,如果使用视频 pts 为基准的话,能感觉到明显的音频速度变化,而我们人眼对视频画面的变化是不敏感的,只要渲染的速度达到每秒 60 帧,对人的肉眼就看不出来停顿感。