视频时间戳PTS和DTS的区别
目录
🎬 一、一句话总结
📦 二、为什么会不同(以视频帧为例)
📖 三、形象例子:I-B-P 顺序
🔄 详细对比表
🧠 四、总结与用途
🎨 五、通俗类比(生活版)
理解 PTS (Presentation Timestamp) 和 DTS (Decoding Timestamp) 是从“能播视频”到“会做播放器”的关键分水岭。
🎬 一、一句话总结
-
PTS(Presentation Timestamp):“这帧该什么时候显示”。
-
DTS(Decoding Timestamp):“这帧该什么时候解码”。
换句话说:
-
PTS 是 “屏幕播放的顺序”;
-
DTS 是 “解码器处理的顺序”。
在多数情况下它们相等,但当有 B 帧(双向预测帧)出现时,它们就会不同。
📦 二、为什么会不同(以视频帧为例)
视频压缩主要使用以下三种帧类型:
| 帧类型 | 含义 | 是否依赖其他帧 | 举例 |
|---|---|---|---|
| I 帧 | 关键帧(完整图像) | 否 | 一张完整图片 |
| P 帧 | 预测帧(参考前面) | 是 | “只存前一帧的变化” |
| B 帧 | 双向预测帧(参考前后) | 是 | “既看前又看后” |
B 帧的特性(需要参考“未来”的帧)是导致 PTS 和 DTS 不一致的根本原因。
📖 三、形象例子:I-B-P 顺序
假设视频的**播放顺序(PTS)**如下:
| 显示顺序 (PTS) | 帧类型 |
|---|---|
| 1 | I 帧 |
| 2 | B 帧 |
| 3 | P 帧 |
由于 B 帧(第 2 帧)需要参考后面的 P 帧(第 3 帧),所以它必须等 P 帧先解码完,才能自己被解码。
于是:
-
**解码顺序(DTS)**必须是:
I → P → B -
**播放顺序(PTS)**仍然是:
I → B → P
🔄 详细对比表
| 帧 | 解码顺序 (DTS) | 显示顺序 (PTS) | 说明 |
|---|---|---|---|
| I 帧 | 1 | 1 | 关键帧,先解码先显示。 |
| P 帧 | 2 | 3 | 要先解码(DTS=2),供 B 帧参考,但延迟显示(PTS=3)。 |
| B 帧 | 3 | 2 | 等 P 帧解码完再解码(DTS=3),但按预期时间显示(PTS=2)。 |
🎯 关键点:
由于 B 帧依赖未来帧,导致封装(Demuxer)后的数据包,其解码顺序(DTS)会领先于其显示顺序(PTS)。
🧠 四、总结与用途
| 时间戳类型 | 控制对象 | 用途 |
|---|---|---|
| DTS | 解码器(Decoder) | 控制解码顺序(帧何时送入解码器处理)。 |
| PTS | 播放器(Player) | 控制播放顺序(帧何时输出到屏幕/与音频同步)。 |
当 FFmpeg 或任何解码器输出一帧解码好的图像时,它会带上该帧的 frame->pts。播放线程会严格根据这个 PTS 来决定什么时候将图像渲染到屏幕上,并与音频同步,从而保证流畅的观看体验。
🎨 五、通俗类比(生活版)
想象你是个电影剪辑师,正在处理三段素材:A、B、C。
-
你想要的播放顺序(PTS)是:
A → B → C。 -
但是 B 片段 需要用到 C 片段中的一小部分镜头(双向预测)。
-
所以你必须先处理 C, 再回来做 B。
➡️ 这时:
-
处理顺序 (DTS) =
A → C → B -
播放顺序 (PTS) =
A → B → C
