常見視頻封裝格式(3) — MP4

1 概述

日常生活中,看到的視頻文件的後綴名如 .mp4、.avi、.rmvb 都是屬於視頻文件的封裝格式。所謂封裝格式,就是以怎樣的方式將視頻軌、音頻軌、字幕軌等信息組合在一起。說得通俗點,視頻軌相當於飯,而音頻軌相當於菜,封裝格式就是一個碗或者一個鍋,是用來盛放飯菜的容器。

視頻文件的封裝格式並不影響視頻的畫質,影響視頻畫面質量的是視頻的編碼格式。

下面介紹常見的視頻封裝格式 - MP4

MP4(MPEG-4 Part 14)是一種常見的多媒體容器格式,它是在 “ISO/IEC 14496-14” 標準文件中定義的,屬於 MPEG-4 的一部分。

MP4 是一種較爲全面的容器格式,被認爲可以在其中嵌入任何形式的數據,,不過我們常見的大部分的 MP4 文件存放的 AVC(H.264) 或 MPEG-4(Part 2) 編碼的視頻和 AAC 編碼的音頻。MP4 格式的官方文件後綴名是 “.mp4”,還有其他的以 mp4 爲基礎進行的擴展或者是閹割版的格式,如 M4V、 3GP、F4V 等。

2 box 結構樹

MP4 文件中所有數據都裝在 box 中,也就是說 MP4 由若干個 box 組成,每個 box 有類型和長度,包含不同的信息,可以將 box 理解爲一個數據對象塊。box 中可以嵌套另一個 box,這種 box 稱爲 container box。

MP4 文件 box 以樹形結構的方式組織, 一個簡單的 MP4 文件由以下 box 結構數組成(mp4info 工具查看 MP4 文件結構):

[外鏈圖片轉存失敗(img-n9znryJ5-1562556718300)(https://gitee.com/kevin1993175/image_resource/raw/master/mp4info.png)]

根節點之下,主要包含以下三個 box 節點:

  1. ftyp:File Type Box,文件類型
  2. moov:Movie Box,文件媒體的 metadata 信息
  3. mdat:Media Data Box,具體的媒體數據
  • 一個 MP4 文件有且僅有一個 “ftyp” 類型的 box,作爲 MP4 格式的標識幷包含一些關於文件的一些信息;
  • ftyp box 之後會有一個 “moov” 類型的 box(Movie Box),它是一種 container box,子 box 中包含了媒體的 metadata 信息;
  • MP4文件的媒體數據包含在 “mdat” 類型的 box(Midia Data Box)中,該類型的 box 也是 container box,可以有多個,也可以沒有(當媒體數據全部引用其他文件時),媒體數據的結構由 metadata 進行描述;

要更深入的瞭解 MP4 封裝格式,首先需要理解幾個基本概念:

[外鏈圖片轉存失敗(img-cSbRSpOS-1562556718302)(https://gitee.com/kevin1993175/image_resource/raw/master/mp4_base.png)]

  1. track:表示一些 sample 的集合,對於媒體數據來說,track 表示一個視頻或音頻序列
  2. sample:video sample 即爲一幀視頻或一組連續視頻幀,audio sample 即爲一段連續的壓縮音頻,它們統稱 sample
  3. chunk:一個 track 中連續幾個 sample 組成的單元

3 MP4 重要 box 詳解

3.1 box

mp4 文件由若干個 box 組成。下面是 box 結構示意圖:

[外鏈圖片轉存失敗(img-saiQtxCL-1562556718303)(https://gitee.com/kevin1993175/image_resource/raw/master/mp4_box.png)]

  1. box 由 header 和 body 組成,其中 header 指明 box 的 size 和 type。size 是指包含 box header 的整個 box 的大小。
  2. box type,通常是 4 個 ASCII 碼的字符如 “ftyp”、“moov” 等。
  3. 如果 header size 爲 1,則表示 box 長度需要更多的 bits 來描述,在後面會有一個 64 bit 位的 largesize 用來描述 box 的長度。如果 size 爲 0,表示該 box 爲文件的最後一個 box,文件結尾(存在於 “mdat” 類型的 box 中)。
  4. container box 可以包含 box
  5. box 分爲兩種,Box 和 Fullbox。FullBox 是 Box 的擴展,Header 中增加了version 和 flags 字段。

3.2 File Type Box(ftyp)

File Type Box 有且只有 1 個,並且只能被包含在文件層,不能被其他 box 包含。該 box 應該被放在文件的最開始,指示該 MP4 文件應用的相關信息。

“ftyp” body 部分依次包括 1 個 32 位的 major brand(4個字符),1 個 32 位的 minor version(整數)和 1 個以 32 位(4個字符)爲單位元素的數組 compatible brands。這些都是用來指示文件應用級別的信息。

截取一個 MP4 文件最開頭的 File Type Box:

00 00 00 14 66 74 79 70 69 73 6F 6D 00 00 00 01
69 73 6F 6D

可以看出,前面 8 個字節是 box header,其中前 4 個字節爲 box size 爲 0x14 = 20,後 4 個字節爲 box type(ftyp),box body 包含 (20- 8) = 12 個字節。

3.3 Movie Box(moov)

Movie Box 中包含了文件媒體的 metadata 信息,“moov” 是一個 container box,具體的內容信息在其子 box 中。

“moov” 中包含1個 “mvhd” 和若干個 “trak”。其中 “mvhd” 是 header box,一般作爲 "moov " box 的第一個子 box 出現。“trak” 包含了一個 track 也就是一個媒體流序列的相關信息,是一個 container box。下圖是 “moov” 的一個字節實例,其中紅色部分爲 box header,綠色爲 “mvhd”,黃色爲一部分的 “track”。

[外鏈圖片轉存失敗(img-BUMWAmEo-1562556718303)(https://gitee.com/kevin1993175/image_resource/raw/master/mp4_moov.jpg)]

可以看到,該 moov box header 佔 8 個字節,整個 box size 爲 0x5AEB = 23272 字節

3.4 Movie Header Box(mvhd)

[外鏈圖片轉存失敗(img-7Eaf3IJ9-1562556718303)(https://gitee.com/kevin1993175/image_resource/raw/master/mp4_mvhd.jpg)]

mvhd 結構如下表,具體值以上面的 mvhd 字節舉例:

字段 字節數 說明
box size 4 mvhd box size,0xC8 = 108 字節
box type 4 box type,固定爲 “mvhd”
box version 1 box 版本,一般爲 0
flags 3 flag
creation time 4 創建時間(相對於 UTC 時間 1904-01-01 零點的秒數)
modification time 4 修改時間
time scale 4 文件媒體在 1 秒時間內的刻度值,可以理解爲 1 秒長度的時間單元數。值 0x0258 = 600
duration 4 媒體流時間長度,用 duration + time scale 計算時長,如實例值 0xA410 = 42000 video track->time scale = 600,則時長 = duration / scale = 88 秒
rate 4 推薦播放速率,高 16 位和低 16 位分別爲小數點整數部分和小數部分,即 [16.16] 格式,該值爲 1.0 表示正常前向播放
volume 2 與 rate 類似,[8.8] 格式,1.0(0x0100)表示最大音量
reserved 10 保留位,固定全設爲 0
matrix 36 視頻變換矩陣
pre-defined 24
next track id 4 下一個 track 使用的 id 號

3.5 Track Box(trak)

Track Box 是一個 container box,其子 box 包含了該 track 的媒體數據引用和描述。一個 mp4 文件可以包含多個 track 且至少有一個 track,track 之間是獨立,有自己的時間和空間信息。Track Box 必須包含一個 “tkhd” 和一個 “mdia”,此外還有很多可選的 box。其中 “tkhd” 爲 track header box,“mdia” 爲 media box,該 box 包含一些 track 媒體數據信息,也是一個 container box。

“trak” box 的字節實例如下圖,其中黃色爲 “trak” box 頭,綠色爲 “tkhd”,藍色爲 “edts”(一個可選 box),紅色爲一部分 “mdia”。

[外鏈圖片轉存失敗(img-q7uTaBCL-1562556718304)(https://gitee.com/kevin1993175/image_resource/raw/master/mp4_trak.jpg)]

1)Track Header Box(tkhd)

“tkhd” 結構如下表,具體值以上面的 tkhd 字節舉例:

字段 字節數 說明
box size 4 tkhd box size,0x5C = 92 字節
box type 4 box type,固定爲 “tkhd”
box version 1 box 版本,一般爲 0
flags 3 flag,按位或操作結果值,定義見表格後說明
creation time 4 創建時間(相對於 UTC 時間 1904-01-01 零點的秒數)
modification time 4 修改時間
track id 4 track id 號,不能重複且不能爲 0,字節實例中值爲 1
reserved 4 保留位
duration 4 track 時間長度,用 duration + time scale 計算時長,如實例值 0xA410 = 42000 video track->time scale = 600,則時長 = duration / scale = 88 秒
reserved 8 保留位
layer 2 視頻層,默認爲 0,值小的在上層
alternate group 2 track 分組信息,默認爲 0 表示該 track 未與其他 track 有羣組關係
volume 2 [8.8] 格式,1.0(0x0100)表示最大音量
reserved 2 保留位
matrix 36 視頻變換矩陣
width 4 寬,字節勢力中值爲:
height 4 高,均爲 [16.16] 格式值,用於播放時的展示寬高

表中 flag 爲按位或操作結果值,預定義如下:

  1. 0x000001 track_enabled,表示該 track 是否可用
  2. 0x000002 track_in_movie,表示該 track 是否在播放中被引用;
  3. 0x000004 track_in_preview,表示該 track 是否在預覽時被引用;

一般該值爲 7,如果一個媒體所有 track 均未設置 track_in_movie 和 track_in_preview,將被理解爲所有 track 均設置了這兩項。

2)Media Box(mdia)

“mdia” 也是個 container box,其子 box 的結構和種類還是比較複雜的。先來看一個 “mdia” 的實例結構樹圖。

[外鏈圖片轉存失敗(img-MFhfs1ft-1562556718304)(https://gitee.com/kevin1993175/image_resource/raw/master/mp4_mdia_info.jpg)]

總體來說,“mdia” 定義了 track 媒體類型以及 sample 數據,描述 sample 信息。一般 “mdia” 包含一個 “mdhd”、一個 “hdlr” 和一個 “minf”,其中 “mdhd” 爲 media header box,“hdlr” 爲 handler reference box,“minf” 爲 media information box。

3.6 Free Space Box(free)

“free” 中的內容是無關緊要的,可以被忽略。該 box 被刪除後,不會對播放產生任何影響

3.7 Meida Data Box(mdat)

該 box 包含於文件層,可以有多個,也可以沒有(當媒體數據全部爲外部文件引用時),用來存儲媒體數據。數據直接跟在 box type 字段後面,具體數據結構的意義需要參考 metadata(主要在sample table中描述)。

可參考資料

在線 mp4box 解析工具

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章