“校正后的结论”
在 MP4 的
stbl里:
每个 sample“逻辑上”都有时间戳,
但“物理上”并不是逐 sample 存一个 timestamp。
MP4 用的是:
时间表(run-length encoding + 累加)
而不是:
sample → timestamp 的一一数组
二、MP4 的时间体系:先立坐标系
MP4 有几个“时间单位”?
至少要分清这三个:
| 层级 | 时间基 |
|---|---|
| Movie(mvhd) | movie timescale |
| Track(tkhd / mdhd) | track timescale |
| Sample(stbl) | 基于 track timescale |
所有 sample 时间,最终都落在 track timescale 上
例如:
mdhd.timescale = 90000
那就和 RTP video 的 90 kHz 非常像,但语义完全不同。
三、stbl 里到底怎么“描述 sample 的时间”?
stbl(Sample Table Box)里,真正决定时间的只有三个 box:
stts —— Sample Decoding Time(最关键)
stts 的结构
(entry_count)
{
sample_count,
sample_delta
}[]
含义是:
连续
sample_count个 sample,
它们的解码时间间隔都是sample_delta
这就是“不是逐 sample 存 timestamp”的原因。
举个最典型的视频例子(固定帧率)
30 fps 视频,timescale = 90000:
stts:
sample_count = 300
sample_delta = 3000
计算方式:
90000 / 30 = 3000
第 N 个 sample 的 DTS:
DTS(N) = Σ sample_delta[0..N-1]
ctts —— Composition Time Offset(B 帧才有)
如果视频 有 B 帧:
-
解码顺序 ≠ 显示顺序
-
就需要 PTS ≠ DTS
这时候:
PTS = DTS + composition_offset
没有 B 帧的视频,根本没有 ctts box
stss —— Sync Sample(关键帧)
这个 box:
-
不决定时间
-
只告诉你:
哪些 sample 是 I 帧(可 seek 点)
4245

被折叠的 条评论
为什么被折叠?



