H264—MP4格式及在MP4文件中提取H264的SPS、PPS及碼流

SkySeraph?Apr 1st 2012?

Email:skyseraph00@163.com?


一、MP4格式基本概念

MP4格式對應標準MPEG-4標準(ISO/IEC14496)

?


二、MP4封裝格式核心概念

1? MP4封裝格式對應標準為 ISO/IEC 14496-12(信息技術 視聽對象編碼的第12部分: ISO 基本媒體文件格式/Information technology Coding of audio-visual objects Part 12: ISO base media file format)

 附-- 標準免費下載: Freely Available Standards????http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html

?

2? MP4封裝格式是基于QuickTime容器格式定義,媒體描述與媒體數據分開,目前被廣泛應用于封裝h.264視頻和ACC音頻,是高清視頻/HDV的代表。


?

3??MP4文件中所有數據都封裝在box中(對應QuickTime中的atom),即MP4文件是由若干個box組成,每個box有長度和類型,每個box中還可以包含另外的子box(稱container box)。

 一個MP4文件首先會有且只有一個“ftyp”類型的box,作為MP4格式的標志并包含關于文件的一些信息;之后會有且只有一個“moov”類型的box(Movie Box),它是一種container box,子box包含了媒體的metadata信息;MP4文件的媒體數據包含在“mdat”類型的box(Midia Data Box)中,該類型的box也是container box,可以有多個,也可以沒有(當媒體數據全部引用其他文件時),媒體數據的結構由metadata進行描述。


?

4??MP4中box存儲方式為大端模式。一般,標準的box開頭會有四個字節的box size。


?

5?幾個名詞?

track

表示一些sample的集合,對于媒體數據來說,track表示一個視頻或音頻序列。

hint track

特殊的track,并不包含媒體數據,包含的是一些將其他數據track打包成流媒體的指示信息。

sample

對于非hint ? track來說,video sample即為一幀視頻,或一組連續視頻幀,audio sample即為一段連續的壓縮音頻,它們統稱sample。

對于hint ? track,sample定義一個或多個流媒體包的格式。

sample table

指明sampe時序和物理布局的表。

chunk

一個track的幾個sample組成的單元。

?


三、MP4封裝格式結構圖

1 實例樣本

來源于Android MediaRecoder視頻錄制,平臺為華為T8300和TCL968,mp4info查看如下

EsEYE查看如下

winhex分析如下:

?

2 box結構圖

接下來對h264編碼中有用的幾個進行闡述,其它不再描述。

3 ftypfile type box

如下圖所示,開始的四字節00 00 00 00 18表示該boxsize24字節(含頭),然后66 74 79 70ftypBOX TYPE,其它是一些格式兼容等相關信息。

4? mdat

如下圖所示,BOX YPE為6D 64 61 74 ,緊接著的00 00 09 39表示sliece長度

5 avcC

如下圖所示,紅色為BOX TYPE

?


四、MP4文件中h264?SPSPPS獲取

1? 【參考依據】ISO/IEC 14496-15 (下載)

2? 【綜述】在H264中,SPS和PPS存在于NALU header中,而在MP4文件中,SPS和PPS存在于AVCDecoderConfigurationRecord, 首先要定位avcC.

3? 【定義】

①參數集:一組很少改變的,為大量VCL NALU 提供解碼信息的數據。

?? 序列參數集SPS作用于一系列連續的編碼圖像,而圖像參數集PPS作用于編碼視頻序列中一個或多個獨立的圖像。

?? 如果解碼器沒能正確接收到這兩個參數集,那么其他NALU 也是無法解碼的。因此它們一般在發送其它 NALU 之前發送,并且使用不同的信道或者更加可靠的傳輸協議(如TCP)進行傳輸,也可以重復傳輸。

②關于AVCDecoderConfigurationRecord結構定義為  

4? 【實例分析】?數據如上avcC圖所示,現在對數據進行詳細分析

所以,提取的SPSPPS分別為67 42 00 1E A6 81 41 F968 CE 38 80

?


五、MP4文件中的H264 data /NALU slice

1? 【參考】H264官方文檔(下載) + 畢書—新一代視頻壓縮編碼標準(下載)

2? 【綜述】

①?MP4格式文件中,H264 slice并不是以00 00 00 01來作分割,而是存儲在mdat box中。

②??H264基本碼流由一些列的NALU組成。原始的NALU單元組成:[start code] + [NALU header] + [NALU payload]

?

start ? code

1字節

00 00 01??00 00 00 01

需要添加的

NALU header

1字節

如下3

通過mdat定位

?

③??H264基本碼流結構分兩層:視頻編碼層VCL和網絡適配層NAL,這樣使信號處理和網路傳輸分離

?

VCL

負責高效視頻內容表示

NAL

以網絡所要求的恰當方式對數據進行打包和發送

?

3? 【定義】 NALU header

+---------------+

|0|1|2|3|4|5|6|7|

+-+-+-+-+-+-+-+-+

|F|NRI| Type |

+---------------+

特別的,當值為78分別為SPSPPS

畢書(下載)(P191)上的定義為:

?

4? 【實例分析】數據分析,數據如上圖mdat所示

6D 64 61 74

mdat ? BOX TYPE

00 00 ? 09 39

silce長度,2361

?

接下來的65就是NALU header,可以由65&0x1F來求的后五個bit,從而得知此sliceI frame

注意mdatsilce之間有可能存在若干占位符,我在TCL手機測試時就出現了連續的00的占位符,這樣后面用H264硬編碼時會比較麻煩一點。

?


Ref/Related

1 相關資料和工具在文中鏈接下載

2?http://www.52rd.com/Blog/wqyuwss/559/4/

3?http://blog.csdn.net/szu030606/article/details/5943279

4?http://blog.csdn.net/k1988/article/details/5654631

5?http://www.cppblog.com/czanyou/archive/2008/11/26/67940.html

6?http://krdai.info/blog/sps-pps-in-mp4-format.html

7?http://www.cnitblog.com/zouzheng/archive/2007/04/04/25155.html

8?http://bbs.chinavideo.org/viewthread.php?tid=10273

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383465.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383465.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383465.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AAC音頻格式分析

關于AAC音頻格式基本情況,可參考維基百科http://en.wikipedia.org/wiki/Advanced_Audio_Coding AAC音頻格式分析 AAC音頻格式有ADIF和ADTS: ADIF:Audio Data Interchange Format 音頻數據交換格式。這種格式的特征是可以確定的找到這個音頻數…

tar壓縮隱藏文件

如果想tar 壓縮包含隱藏文件的目錄,同時排除掉部分無用的目錄 tar -czvf 20161009.tar.gz * .[!.]* --exclude .git 在Linux下打包tar文件時添加密碼的方法 在當前目錄下有一個pma目錄的文件夾: 1、使用tar對文件壓縮加密: 代碼如下: # tar -zcvf - pma…

linux 怎么把^M去掉

在linux下,不可避免的會用VIM打開一些windows下編輯過的文本文件。我們會發現文件的每行結尾都會有一個^M符號,這是因為 DOS下的編輯器和Linux編輯器對文件行末的回車符處理不一致, 對于回車符的定義: windows:0D0A un…

關于cp命令中拷貝所有的寫法

今天在編寫一個腳本的時候,發現一個比較奇怪的問題:就是在使用cp拷貝當前目錄下所有文件到目標目錄的時候,源和目標大大不同。原來一直沒有留意有這樣的問題,后來查了些資料,才知道以前一直使用的格式有誤,…

cp -r 和 cp -R 的區別

今天倒騰linux根文件系統的時候發現 cp -r /dev /dev_bak 時,竟然會 將磁盤設備中的數據進行一次拷貝,而不是僅僅建立設備文件。于是到網上搜了一把,收獲不小。http://www.loveunix.net/html/200407/33920.html這里有人問同樣的問題&#xff…

Makefile選項CFLAGS,LDFLAGS,LIBS

CFLAGS 表示用于 C 編譯器的選項, CXXFLAGS 表示用于 C 編譯器的選項。 這兩個變量實際上涵蓋了編譯和匯編兩個步驟。 CFLAGS: 指定頭文件(.h文件)的路徑,如:CFLAGS-I/usr/include -I/path/include。同樣地…

smbclient和掛載samba共享目錄

1,列出某個IP地址所提供的共享文件夾 smbclient -L 198.168.0.1 -U marsaber%12332112345672,像FTP客戶端一樣使用smbclient smbclient //192.168.0.1/tmp -U marsaber%1233211234567 執行smbclient命令成功后,進入smbclient環境,出現提示符…

linux 下source命令

當我修改了/etc/profile文件,我想讓它立刻生效,而不用重新登錄;這時就想到用 source 命令,如:source /etc/profile對source進行了 學習 ,并且用它與sh 執行腳本進行了對比,現在總結一下。source命令&#x…

make Image uImage與zImage的區別

內核編譯(make)之后會生成兩個文件,一個Image,一個zImage,其中Image為內核映像文件,而zImage為內核的一種映像壓縮文件,Image大約為4M,而zImage不到2M。 那么uImage又是什么的&#…

ubuntu下tftp的安裝、配置、使用

1. 安裝$ apt-get install tftp-hpa tftpd-hpa2. 建立目錄$ mkdir /tftpboot # 這是建立tftp傳輸目錄。$ sudo chmod 0777 /tftpboot$ sudo touch test.txt # test.txt文件最好輸入內容以便區分3. 配置$ sudo vi /etc/default/tftpd-hpa# /etc/default/tftpd-hpaTFTP_USERNAME&…

ubuntu下搭建nfs服務器

1.1 搭建NFS服務器 NFS(Network FileSystem,網絡文件系統)是由SUN公司發展,并于1984年推出的技術,用于在不同機器,不同操作系統之間通過網絡互相分享各自的文件。NFS設計之初就是為了在不同的系統間使…

uboot的常用命令詳解

U-Boot還提供了更加詳細的命令幫助,通過help命令還可以查看每個命令的參數說明。由于開發過程的需要,有必要先把U-Boot命令的用法弄清楚。接下來,根據每一條命令的幫助信息,解釋一下這些命令的功能和參數。 進入uboot的命令行提示…

minicom 串口信息過長分行顯示

有時串口輸出一行信息比較多,一行顯示不下,這個時候,我們可以用minicom的本身組合鍵設置,超過一行時自動卷起。 minicom 組合鍵的用法是:先按CtrlA組合鍵,然后松開這兩個鍵,再按Z鍵。另外還有一…

uboot 的 bootcmd 和bootargs參數詳解

U-boot的環境變量值得注意的有兩個: bootcmd 和bootargs。 bootargsconsolettyS1,115200n8 mem32M0x0 ispmem8M0x2000000 rmem24M0x2800000 init/linuxrc rootfstypesquashfs root/dev/mtdblock2 rw mtdpartsjz_sfc:256k(boot),2560k(kernel),2048k(root),-(appfs) …

MTD和 uboot中的bootargs 下屬 mtdparts

MTD 設備是象閃存芯片、小型閃存卡、記憶棒等之類的設備,它們在嵌入式設備中的使用正在不斷增長。 MTD 驅動程序是在 Linux 下專門為嵌入式環境開發的新的一類驅動程序。相對于常規塊設備驅動程序,使用 MTD 驅動程序的主要優點在于 MTD 驅動程序是專門為…

Linux應用程序在內存中的地址布局

棧:局部變量(初始化的和未初始化的,但不包含局部靜態變量)、局部只讀變量(const)堆:動態分配的區域(如使用malloc函數申請的區域)BSS段:存儲未初始化的全局變…

比較zImage和uImage的區別

一、vmlinuz vmlinuz是可引導的、壓縮的內核。“vm”代表“Virtual Memory”。Linux 支持虛擬內存,不像老的操作系統比如DOS有640KB內存的限制。Linux能夠使用硬盤空間作為虛擬內存,因此得名“vm”。 vmlinuz的建立有兩種方式。一是編譯內核時通過“make…

編譯faac錯誤分析

編譯faac時遇到了以下的編譯錯誤: /home/xuxuequan/Ingenicwork/toolchain/mips-gcc472-glibc216-32bit/mips-linux-gnu/libc/usr/include/string.h:365:26: error:ambiguates old declaration const char* strcasestr(const char*, const char*) 解決方案&#x…

gcc與g++的區別

一:gcc與g比較 編譯c/c代碼的時候,有人用gcc,有人用g,于是各種說法都來了,譬如c代碼用gcc,而 c代碼用g,或者說編譯用gcc,鏈接用g,一時也不知哪個說法正確,如果…

交叉編譯openssl不修改Makefile的方法

網上流傳的方法都是要修改Makefile的cc值&#xff0c;我來說個不用修改的方法作者&#xff1a;帥得不敢出門 C哈哈堂<31843264>openssl 下載http://www.openssl.org/source/tar -xvf openssl-1.0.1c.tar.gzcd openssl-1.0.1c/CCarm-linux-gcc ./config no-asm shared -…