原文鏈接:http://bbs.pfan.cn/post/413874.html
MP4文件數據結構以及提取部分信息的代碼
一、名詞解釋
- track:音軌,它是樣本的集合,對於媒體數據來說,音軌表示一個視頻或音頻序列。
- hint track:索引音軌,這個特殊的音軌並不包含媒體數據,而是包含了一些將其他數據音軌打包成流媒體的指示信息。如果文件只是本地播放,可以忽略索引音軌,因爲它們只與流媒體有關係。本文不討論索引音軌的內容,只關注包含媒體數據的本地MP4文件。
- sample:樣本,對於非索引音軌來說,視頻樣本即爲一幀視頻,或一組連續視頻幀;音頻樣本即爲一段連續的壓縮音頻。對於索引音軌來說,樣本定義一個或多個流媒體包的格式。
- sample table:樣本表。指明樣本時序和物理佈局的表格。
- chunk:塊。一個音軌中的幾個樣本組成的單元。
- ticks:瞬時,是MP4 文件媒體的最小時間單元。
二、概述
MP4 文件中的媒體描述與媒體數據是分開的,並且媒體數據的組織也很自由,不一定要按照時間順序排列,甚至媒體數據可以直接引用其他文件,這樣,一部電影就可以由一個媒體數據庫中的多個不同文件組成,而不用把它們全部拷貝到一個文件中。同時,MP4也支持流媒體。
MP4文件由許多包(box)組成。包可以嵌套,嵌套的包稱爲集裝包(container box)。
由於嵌套的出現,又形成了層,最頂級的層爲文件層。
包有很多類型(但並不都是必需的),類型名稱由4個小寫的Ascii字符組成。包類型是預先定義好的,有固定的意義。MP4 文件層的常用包類型見表1。
MP4 文件中有關長度和大小的數據,其字節序爲高位在前的存儲方式。
表1 MP4文件層常用的包類型
名稱 | 描述 |
---|---|
ftyp | 描述的文件的版本、兼容協議等信息 |
moov | 本文件中所有媒體數據的宏觀描述信息 |
mdat | 實際媒體數據。我們最終解碼播放的數據都在這裏面 |
moof | 電影片斷描述信息,在流文件中是重中之重 |
mfra | 媒體索引,一般在文件末尾,可通過查詢直接定位所需時間點的媒體數據 |
pdin | 下載信息 |
free | 自由空間 |
skip | 自由空間 |
meta | 元數據 |
meca | 附加元數據集合 |
uuid | 用戶擴展類型 |
說明:
1. 一個MP4文件必有且只有一個”ftyp”類型的包,它在文件的開始位置,也是MP4文件格式的標誌。
2. 一個MP4文件必有且只有一個”moov”類型的包,這是一種集裝包類型,子包包含了媒體的屬性數據(metadata)信息。
3. mdat也是一種集裝包類型,包含着MP4文件的媒體數據,媒體數據的屬性數據由metadata進行描述。當 MP4文件的媒體數據不是全部引用其他文件時,這種包是必有包,還可以有多個。當媒體數據全部引用其他文件時,就不需要這種包了。
4. moof類型包是流文件中的必有包,但本地MP4文件不需要。
三、包的數據結構
包由包頭(header)和包體(body)組成,其中包頭指明包的大小和類型,包體根據包類型有不同的意義和格式。
集裝包也由包頭和包體組成,其包體由若干子包組成,第一個子包稱作頭部包。除了頭部包外,其它子包也可以是集裝包。
下表是包頭的結構。
表2 包頭的結構
名稱 | 數據類型 | 佔用字節 | 說明 |
---|---|---|---|
size | UINT32 | 4 | 包頭和包體的總大小 |
type | 字符型 | 4 | 包類型的Ascii碼字符 |
largesize | UINT64 | 8 | 如果size=1,纔有此項 |
說明:
1. 除了mdat類型的包以外,其它包都只有前兩項,沒有largesize這一項。
2. mdat類型的包纔可能會有largesize。如果size=1,說明包很大,超過了uint32的最大值,這時就會有largesize項,包大小就由該該項值決定,如果size=0,表示該包爲文件的最後一個包,文件結尾即爲該包結尾。
四、ftyp包(File Type Box,文件類型包)
該包在文件的最前面,包含着該MP4文件版本、兼容協議等信息。
文件類型包的包體結構見表3。
表3 ftyp包的包體結構
名稱 | 數據類型 | 佔用字節 | 說明 |
---|---|---|---|
major brand | 字符 | 4 | 主版本 |
minor version | UINT32 | 4 | 次版本 |
compatible brands | 數組 | 不定 |
說明:
1. compatible brands是字符型數組,以4字符爲單位元素,描述兼容協議。
五、moov包(Movie Box,影像包)
該包緊隨在ftyp包後面,它包含了文件媒體的屬性數據(metadata)。moov是集裝包,具體內容由子包詮釋。
一般情況下,moov包中除了包頭外,它的包體由1個mvhd子包和若干個trak子包構成。mvhd爲頭部包,trak是音軌包。音軌包也是集裝包,其中的一系列子包描述了每個媒體軌道的具體信息。
下面分別解析。
- 影像包的mvhd(頭部包)
mvhd中記錄了創建時間、修改時間、時間度量標尺、可播放時長等信息。
表4 影像包mvhd的結構
名稱 | 字節數 | 意義 |
---|---|---|
box size | 4 | 包大小,共108(&H6C)字節 |
box type | 4 | 包類型,”mvhd”字符 |
version | 1 | 版本,一般爲0 |
flags | 3 | 標記,一般爲0 |
creation time | 4 | 創建時間(相對於UTC時間1904-01-01零時的秒數) |
modification time | 4 | 修改時間(同上) |
time scale | 4 | 時間刻度,設置文件媒體每秒=多少個瞬時 |
duration | 4 | 持續時間,設置該音軌共有多少個瞬時 |
rate | 4 | 播放速率 |
volume | 2 | 音量 |
reserved | 10 | 保留位 |
matrix | 36 | 視頻變換矩陣 |
pre-defined | 24 | 預定義(用途不明) |
next track id | 4 | 下一條音軌的ID號 |
說明:
1. 用duration和time scale可以計算音軌時長:音軌時長(秒)=duration÷time scale
例如:音頻音軌的time scale = 8000, duration = 560128,時長=560128÷8000=70.016秒
視頻音軌的time scale = 600, duration = 42000,時長=42000÷600=70秒
2. rate是[16.16] 格式,高16位和低16位分別爲小數的整數部分和小數部分,1.0表示正常向前播放
3. volume是[8.8] 格式。如果是音頻音軌,1.0表示最大音量;如果是視頻音軌,該項值=0
4. next track id指向的音軌其實是不存在的,此ID號是在本moov包中最大的音軌ID號再加上1。
博客模板如下
本Markdown編輯器使用StackEdit修改而來,用它寫博客,將會帶來全新的體驗哦:
- Markdown和擴展Markdown簡潔的語法**
- 代碼塊高亮
- 圖片鏈接和圖片上傳
- LaTex數學公式
- UML序列圖和流程圖
- 離線寫博客
- 導入導出Markdown文件
- 豐富的快捷鍵
快捷鍵
- 加粗
Ctrl + B
- 斜體
Ctrl + I
- 引用
Ctrl + Q
- 插入鏈接
Ctrl + L
- 插入代碼
Ctrl + K
- 插入圖片
Ctrl + G
- 提升標題
Ctrl + H
- 有序列表
Ctrl + O
- 無序列表
Ctrl + U
- 橫線
Ctrl + R
- 撤銷
Ctrl + Z
- 重做
Ctrl + Y
Markdown及擴展
Markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文本格式編寫文檔,然後轉換成格式豐富的HTML頁面。 —— [ 維基百科 ]
使用簡單的符號標識不同的標題,將某些文字標記爲粗體或者斜體,創建一個鏈接等,詳細語法參考幫助?。
本編輯器支持 Markdown Extra , 擴展了很多好用的功能。具體請參考Github.
表格
Markdown Extra 表格語法:
項目 | 價格 |
---|---|
Computer | $1600 |
Phone | $12 |
Pipe | $1 |
可以使用冒號來定義對齊方式:
項目 | 價格 | 數量 |
---|---|---|
Computer | 1600 元 | 5 |
Phone | 12 元 | 12 |
Pipe | 1 元 | 234 |
定義列表
- Markdown Extra 定義列表語法:
- 項目1
- 項目2
- 定義 A
- 定義 B
- 項目3
- 定義 C
-
定義 D
定義D內容
代碼塊
代碼塊語法遵循標準markdown代碼,例如:
@requires_authorization
def somefunc(param1='', param2=0):
'''A docstring'''
if param1 > param2: # interesting
print 'Greater'
return (param2 - param1 + 1) or None
class SomeClass:
pass
>>> message = '''interpreter
... prompt'''
腳註
生成一個腳註1.
目錄
用 [TOC]
來生成目錄:
數學公式
使用MathJax渲染LaTex 數學公式,詳見math.stackexchange.com.
- 行內公式,數學公式爲:
Γ(n)=(n−1)!∀n∈N 。 - 塊級公式:
更多LaTex語法請參考 這兒.
UML 圖:
可以渲染序列圖:
或者流程圖:
離線寫博客
即使用戶在沒有網絡的情況下,也可以通過本編輯器離線寫博客(直接在曾經使用過的瀏覽器中輸入write.blog.csdn.net/mdeditor即可。Markdown編輯器使用瀏覽器離線存儲將內容保存在本地。
用戶寫博客的過程中,內容實時保存在瀏覽器緩存中,在用戶關閉瀏覽器或者其它異常情況下,內容不會丟失。用戶再次打開瀏覽器時,會顯示上次用戶正在編輯的沒有發表的內容。
博客發表後,本地緩存將被刪除。
用戶可以選擇 把正在寫的博客保存到服務器草稿箱,即使換瀏覽器或者清除緩存,內容也不會丟失。
注意:雖然瀏覽器存儲大部分時候都比較可靠,但爲了您的數據安全,在聯網後,請務必及時發表或者保存到服務器草稿箱。
瀏覽器兼容
- 目前,本編輯器對Chrome瀏覽器支持最爲完整。建議大家使用較新版本的Chrome。
- IE9以下不支持
- IE9,10,11存在以下問題
- 不支持離線功能
- IE9不支持文件導入導出
- IE10不支持拖拽文件導入
- 這裏是 腳註 的 內容. ↩