box有且只有1個,而且只能被包含在文件層,而不能被其餘box包含。該box應該被放在文件的最開始,知道應該使用哪一種協議對這該文件解析,是後續解讀文件基礎。ide
box包含了文件媒體的metadata信息,「moov」是一個container box,具體內容信息由子box,好比包含多個trak(視頻流,音頻流),moov第一個box通常是mvhd。atom
mvhd(Movie Header Box),主要存放着視頻文件的meta dataspa
字段 | 字節數 | 意義 |
---|---|---|
box size | 4 | box大小 |
box type | 4 | box類型 |
version | 1 | box版本, 0或者1, 通常爲0(如下字節數均按照version=0) |
flags | 3 | 擴展的movie header標誌 |
creation | 4 | 建立時間(相對於UTC時間1904-01-01 0點秒數 |
modification | 4 | 修改時間 |
time scale | 4 | 文件媒體在1秒時間內的刻度值, 能夠理解爲1秒長度的時間單元數 |
duration | 4 | 該tack的時間長度, 用duration和time scale值能夠計算track時長, 好比audio track的time scale = 8000, duration = 560128, 時長爲70.016, video track 的time scale = 600, duration = 42000, 時長爲70 |
rate | 4 | 推薦播放速率, 高16位和低16位分別爲小數點整數播放和小數部分, 即[16, 16] 格式, 該值爲1.0(0x00010000) 表示正常前向播放 |
volume | 2 | 與rate類型, [8, 8]格式, 1.0 (0x0100) 表示最大音量 |
reserved | 10 | 保留位 |
matrix | 36 | 視頻轉換矩陣 |
pre-defined | 24 | 未使用 |
next track id | 4 | 下一個track使用的id號,未使用 |
time scale 至關於定義了標準的 1 秒在這部電影裏面的刻度是多少code
例如 audio track 的 time scale = 8000, duration = 560128,因此總長度是 70.016,video track 的 time scale = 600, duration = 42000,因此總長度是 70視頻
整部電影的 duration = 每一個幀的 duration 之和(從 Time-to-sample atoms 中得出)blog
例如 audio track 共有 547 個 sample,每一個 sample 的長度是 1024,則總 duration 是 560128,電影長度是 70.016;video track 共有索引
1050 個 sample,每一個 sample 的長度是 40,則總 duration 是 42000,電影長度是 70ip
每一個trak都包含了一個tkhd,記錄時間,空間和音量信息。rem
字段 | 字節數 | 意義 |
---|---|---|
box size | 4 | box大小 |
box type | 4 | box類型 |
version | 1 | box版本,0或1,通常爲0。(如下字節數均按version=0) |
flags | 3 | 按位或操做結果值,預約義以下:0x000001 track_enabled,不然該track不被播放;0x000002 track_in_movie,表示該track在播放中被引用;0x000004 track_in_preview,表示該track在預覽時被引用。通常該值爲7,若是一個媒體全部track均未設置track_in_movie和track_in_preview,將被理解爲全部track均設置了這兩項;對於hint track,該值爲0 |
creation time | 4 | 建立時間(相對於UTC時間1904-01-01零點的秒數) |
modification time | 4 | 修改時間 |
track id | 4 | id號,不能重複且不能爲0 |
reserved | 4 | 保留位 |
duration | 4 | track的時間長度 |
reserved | 8 | 保留位 |
layer | 2 | 視頻層,默認爲0,值小的在上層 |
alternate group | 2 | track分組信息,默認爲0表示該track未與其餘track有羣組關係 |
volume | 2 | [8.8] 格式,若是爲音頻track,1.0(0x0100)表示最大音量;不然爲0 |
reserved | 2 | 保留位 |
matrix | 36 | 視頻變換矩陣 |
width | 4 | 寬 |
height | 4 | 高,均爲 [16.16] 格式值,與sample描述中的實際畫面大小比值,用於播放時的展現寬高 |
不是必須的,將時間線映射在media時間線上。同步
track的媒體類型和sample數據,例如音頻或視頻,包含一個media header atom ('mdhd'),一個handler reference ('hdlr'),一個媒體信息引用('minf')和用戶數據atom('udta').
主要定義了該Track的媒體頭信息,最重要的兩個字段是Time scale和Duration,分別表示了該Track的時間戳和時長信息,這個時間戳信息也是PTS和DTS的單位。
字段 | 字節數 | 意義 |
---|---|---|
box size | 4 | box大小 |
box type | 4 | box類型 |
version | 1 | box版本,0或1,通常爲0。(如下字節數均按version=0) |
flags | 3 | 該Box該字段填充0 |
creation time | 4 | 當前Track建立時間(相對於UTC時間1904-01-01零點的秒數) |
modification time | 4 | 當前Track修改時間(相對於UTC時間1904-01-01零點的秒數) |
timescale | 4 | 當前Track的時間計算單位 |
duration | 4 | 該Track的播放時長,須要參考前面的timescale計算 |
language | 2 | 媒體語言碼,參考其餘標準 |
qualiiy | 2 | 媒體的回放質量 |
解釋了媒體的播放過程信息,用來設置不一樣Track的處理方式,標識了該Track的類型。
hand sub type,視頻:‘vide’,音頻:‘soun
最複雜box,包含多個子box,創建時間到真實音視頻sample的映射關係
Sample是媒體數據的存儲單元,其中存儲在Media的chunk中,每一個Sample的時間和位置、編解碼信息、和chunk關係等都是由Stbl Box來描述的,Stbl Box包含了Track中media媒體的全部時間和索引,利用這個容器的Sample信息,就能夠定位Sample的媒體時間、類型、大小以及和其相鄰的Sample。同時該Box是必須在Trak Box中存在的。
採樣描述容器: Sample Description即stsd Box
採樣時間容器: Time To Sample 即stts Box
採樣同步容器: Sync Sample即stss Box
Chunk採樣容器: Sample To Chunk即stsc Box
採樣大小容器: Sample Size即stsz Box
Chunk偏移容器:Chunk Offest即Stco Box
該Box保存了每一個sample的composition time和decode time之間的差值,這裏經過Composition Time就能夠計算出Sample的PTS。
mdat Box這個Box是存儲音視頻數據的Box,要從這個Box解封裝出真實的媒體數據。