FFMPEG 与 mp4
1. FFmpeg 中的 start_time
与 time_base
-
start_time
流的起始时间戳(单位:time_base
),表示第一帧的呈现时间(Presentation Time)。通常用于同步多个流(如音频和视频)。 -
time_base
时间基,是一个分数(例如{1, 1000}
表示毫秒级),用于将时间戳转换为秒:时间(秒) = 时间戳 × time_base.num / time_base.den
1.1 MP4 文件中的对应概念
MP4 文件使用 ISO Base Media File Format (ISOBMFF) 结构,时间信息主要存储在以下 box 中:
1.2 time_base
的对应
-
mdhd
box(Media Header Box)
每个媒体轨道(Track)的mdhd
box 包含timescale
字段,表示该轨道的时间刻度:- 含义:1 秒被分成多少个时间单位(例如
timescale=90000
表示 1/90000 秒为一个单位)。 - 对应关系:FFmpeg 的
time_base
通常是{1, timescale}
。
示例:
若 MP4 轨道的timescale=90000
,则 FFmpeg 可能将time_base
设为{1, 90000}
。 - 含义:1 秒被分成多少个时间单位(例如
1.3 start_time
的对应
-
tfdt
box(Track Fragment Decode Time)
存储每个片段(Fragment)的解码时间,相对于轨道开始时间。 -
ctts
box(Composition Time to Sample)
存储解码时间(DTS)到呈现时间(PTS)的偏移量,影响start_time
的计算。 -
stts
box(Decoding Time to Sample)
定义样本的解码时间间隔,辅助计算绝对时间。
1.4. 转换关系示例
假设 MP4 文件:
- 视频轨道
timescale=90000
- 第一帧的
tfdt
值为18000
(表示 18000/90000 = 0.2 秒)
FFmpeg 读取时:
time_base
={1, 90000}
- time_base = 1 / timescale
start_time
=18000
(时间戳,单位为time_base
)- 实际起始时间(秒) =
18000 × (1/90000) = 0.2
秒 - start_time(起始时间(秒)) = start_time × time_base