在音视频开发中,时间戳(Timestamp)是保障画面流畅和音视频同步(A/V Sync)的核心。如果搞不懂 PTS/DTS 的底层机制,在面对 B 帧、起播黑屏、音画不同步等复杂问题时,基本只能抓瞎。
基于 H.264 底层规范,结合 FFmpeg、VideoToolbox、MediaCodec 等主流框架,我将 PTS/DTS 的核心机理和踩坑经验总结如下。
1. 核心定义与时间基 (Time Base)
1.1 三个核心时间概念
在引入 B 帧的视频流中,单一的时间轴无法满足解码和显示的双重要求,因此定义了三个变量:
- PTS (Presentation Time Stamp):显示时间戳。告诉播放器这一帧应该在什么绝对时间点渲染到屏幕上。
- DTS (Decoding Time Stamp):解码时间戳。告诉解码器这一帧压缩数据(NALU)应该在什么绝对时间点送入解码器。
- CTS (Composition Time Shift):组合时间偏移。即显示时间与解码时间的差值。由于画面必须先解码才能显示,所以通常 PTS ≥ DTS。
音频的特殊性:音频是线性顺序解码的,不存在类似视频 B 帧的前后时域依赖。因此音频的 PTS 永远等于 DTS,处理音频时只需关注 PTS。