MP4容器里的时间戳详解

“校正后的结论”

在 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 点)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值