【轉載】MP4文件數據結構以及提取部分信息的代碼

原文鏈接:http://bbs.pfan.cn/post/413874.html

MP4文件數據結構以及提取部分信息的代碼

一、名詞解釋

  1. track:音軌,它是樣本的集合,對於媒體數據來說,音軌表示一個視頻或音頻序列。
  2. hint track:索引音軌,這個特殊的音軌並不包含媒體數據,而是包含了一些將其他數據音軌打包成流媒體的指示信息。如果文件只是本地播放,可以忽略索引音軌,因爲它們只與流媒體有關係。本文不討論索引音軌的內容,只關注包含媒體數據的本地MP4文件。
  3. sample:樣本,對於非索引音軌來說,視頻樣本即爲一幀視頻,或一組連續視頻幀;音頻樣本即爲一段連續的壓縮音頻。對於索引音軌來說,樣本定義一個或多個流媒體包的格式。
  4. sample table:樣本表。指明樣本時序和物理佈局的表格。
  5. chunk:塊。一個音軌中的幾個樣本組成的單元。
  6. 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是音軌包。音軌包也是集裝包,其中的一系列子包描述了每個媒體軌道的具體信息。
下面分別解析。

  1. 影像包的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修改而來,用它寫博客,將會帶來全新的體驗哦:

  1. 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)=(n1)!nN
  • 塊級公式:

x=b±b24ac2a

更多LaTex語法請參考 這兒.

UML 圖:

可以渲染序列圖:

Created with Raphaël 2.1.0張三張三李四李四嘿,小四兒, 寫博客了沒?李四愣了一下,說:忙得吐血,哪有時間寫。

或者流程圖:

Created with Raphaël 2.1.0開始我的操作確認?結束yesno
  • 關於 序列圖 語法,參考 這兒,
  • 關於 流程圖 語法,參考 這兒.

離線寫博客

即使用戶在沒有網絡的情況下,也可以通過本編輯器離線寫博客(直接在曾經使用過的瀏覽器中輸入write.blog.csdn.net/mdeditor即可。Markdown編輯器使用瀏覽器離線存儲將內容保存在本地。

用戶寫博客的過程中,內容實時保存在瀏覽器緩存中,在用戶關閉瀏覽器或者其它異常情況下,內容不會丟失。用戶再次打開瀏覽器時,會顯示上次用戶正在編輯的沒有發表的內容。

博客發表後,本地緩存將被刪除。 

用戶可以選擇 把正在寫的博客保存到服務器草稿箱,即使換瀏覽器或者清除緩存,內容也不會丟失。

注意:雖然瀏覽器存儲大部分時候都比較可靠,但爲了您的數據安全,在聯網後,請務必及時發表或者保存到服務器草稿箱

瀏覽器兼容

  1. 目前,本編輯器對Chrome瀏覽器支持最爲完整。建議大家使用較新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下問題
    1. 不支持離線功能
    2. IE9不支持文件導入導出
    3. IE10不支持拖拽文件導入


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