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