MP4檔案中h264的 SPS、PPS獲取
【流媒體】H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流
SkySeraph Apr 1st 2012
Email:[email protected].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)
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,:
用EsEYE檢視如下:
2 box結構圖
接下來對h264編碼中有用的幾個進行闡述,其它不再描述。
3 ftyp(file type box)
如下圖所示,開始的四位元組00 00 00 00 18表示該box的size為24位元組(含頭),然後66 74 79 70是ftyp的BOX TYPE,其它是一些格式相容等相關資訊。
4 mdat
如下圖所示,BOX YPE為6D 64 61 74 ,緊接著的00 00 09 39表示sliece長度
5 avcC
如下圖所示,紅色為BOX TYPE
四、MP4檔案中h264的 SPS、PPS獲取
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圖所示,現在對資料進行詳細分析
所以,提取的SPS和PPS分別為67 42 00 1E A6 81 41 F9和68 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 |
+---------------+
特別的,當值為7和8分別為SPS和PPS。
畢書(下載)(P191)上的定義為:
4 【例項分析】資料分析,資料如上圖mdat所示
6D 64 61 74 |
mdat BOX TYPE |
00 00 09 39 |
silce長度,2361 |
接下來的65就是NALU header,可以由65&0x1F來求的後五個bit,從而得知此slice為I frame
注意,mdat與silce之間有可能存在若干佔位符,我在TCL手機測試時就出現了連續的00的佔位符,這樣後面用H264硬編碼時會比較麻煩一點。
Ref/Related
1 相關資料和工具在文中連結下載
相關推薦
使用FFmpeg的SDK庫實現將H.264流封裝進MP4檔案時全域性SPS、PPS與流中SPS、PPS衝突的問題
一、問題1. 使用FFmpeg的SDK庫實現將H.264流封裝進MP4檔案的原始碼大致如下:char* filename = "./test.mp4"AVOutputFormat *fmt;AVStream* video_st;AVFormatContext *av_cont
解析MP4檔案中的sps和pps
一、MP4格式基本概念 MP4格式對應標準MPEG-4標準(ISO/IEC14496) 二、MP4封裝格式核心概念 1 MP4封裝格式對應標準為 ISO/IEC 14496-12(資訊科技 視聽物件編碼的第12部分: ISO 基本媒體檔案格式/Informat
MP4檔案中h264的 SPS、PPS獲取
【流媒體】H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流 SkySeraph Apr 1st 2012 Email:[email protected].com 一、MP4格式基本概念 MP4格式對應標準MPEG-4標準(ISO/IEC14496) 二、MP4封裝格式核
在MP4檔案中提取H264的SPS、PPS及碼流
一、MP4封裝格式的基本概念 1 MP4封裝格式對應標準為 ISO/IEC 14496-12(資訊科技 視聽物件編碼的第12部分: ISO 基本媒體檔案格式/Information technology Coding of audio-visual objects Pa
從MP4頭資訊中提取sps和pps資料
一、MP4格式基本概念 MP4格式對應標準MPEG-4標準(ISO/IEC14496) 二、MP4封裝格式核心概念 1 MP4封裝格式對應標準為 ISO/IEC 14496-12(資訊科技 視聽物件編碼的第12部分: ISO 基本媒體檔案格式/Informati
如何從mp4檔案中獲取幀率資訊
用mediainfo檢視mp4經常會看到有兩個幀率資訊,一個是framerate,一個是original framerate,前者是檔案的實際幀率,後者是h264解碼資訊中的幀率。 計算實際幀率時,需要從mp4的moov box中的mvhd中取得timescale和dura
FFmpeg解碼MP4檔案為h264和YUV檔案
#include <iostream> #ifdef __cplusplus extern "C" { #endif #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #in
Windows下USB磁碟開發系列三:列舉系統中U盤、並獲取其裝置資訊
前面我們介紹了列舉系統中的U盤碟符(見《Windows下USB磁碟開發系列一:列舉系統中U盤的碟符》)、以及獲取USB裝置的資訊(見《Windows下USB磁碟開發系列二:列舉系統中所有USB裝置》)。有個時候我們不僅僅需要獲取U盤碟符(路徑),而且需要獲取該U盤的硬體資訊,比如廠商、friendl
mybatis xml檔案中的大於、小於、及like模糊查詢的寫法
在xml中,特殊符號的轉義寫法如下: < < > > <> <> & & &
MyBatis xml檔案中的大於、小於等符號寫法
在SQL中我們經常會使用到比較的情況,然而在使用Mybatis中XML檔案時,>、<等符號是不能直接使用的,因此,我們需要進行特殊處理。下面介紹兩種處理方式: 第一種:使用特殊符號轉意的寫法 < &
WebRTC、Janus卡頓優化實踐(SPS、PPS丟包)
背景 在弱網環境下如果丟了SPS、PPS,會發生較長時間的卡頓。 服務端 Janus 版本 66 詳述 在視訊通話時,WebRTC傳送端傳送的第一個RTP包只包含SPS、PPS,第二個包是IDR幀,接收端收到後會把SPS、PPS、
如何在inf檔案中修改pid、vid
Inf檔案即Device Information File(裝置資訊檔案),用於引導驅動程式(*.sys)的安裝。它實質上是一個文字檔案,可以用記事本工具開啟檢視和編輯。 簡單介紹一下USB裝置驅
第6章建立函式-----------(在.bashrc檔案中定義函式、在命令列建立函式、在命令列中使用函式)
6.6在命令列中使用函式 指令碼函式可以用於建立比較複雜的操作。指令碼函式不僅可以用作shell指令碼命令,也可以用作命令列介面的命令。一旦在shell中定義了函式,可以從系統的任意目錄使用這個函式。不必擔心PATH環境變數是否包含函式檔案所在目錄。關鍵是
獲取iframe中的內容、查詢獲取指定元素(關於用c++呼叫WEBBROWSER控制元件,使用相關介面操作web頁面元素的一些方法)
最近開發WINDOWS下的應用程式,需要用到C++中呼叫WEBBROWSER控制元件操作網頁的相關技術,查閱了一下相關文件,反覆除錯了幾天,對其中的技術有了一些膚淺的認識,大多數C++程式設計師對COM應該不陌生,其實用C++操作網頁,在前端應用層上主要就是對COM介面的查
H.264中的SPS和PPS
H.264碼流第一個 NALU是 SPS(序列引數集Sequence Parameter Set) 對應H264標準文件 7.3.2.1 序列引數集的語法進行解析 H.264碼流第二個 NALU是 PPS(影象引數集Picture Parameter Se
文字檔案中的空格、換行符、製表符的去除
爬了一段文字,儲存為文字文件後,有很多很多空格,剛看了python的正則表示式,嘗試著使用re模組去除文字內容中的空格。import re f=open("duanzi.txt") data=f.read() print(data) f.close() out=open('o
DSS中的RTP打包傳輸h264時獲取h264的sps和pps資訊
static char base64DecodeTable[256]; static void initBase64DecodeTable() { int i; for (i = 0; i < 256; ++i) base64DecodeTable[i] = (char)0x80;
Servlet(ServletContext配置全域性引數、ServletContext方法、屬性檔案中獲取資料庫連線引數)
通過ServletContext物件獲取資料庫全域性配置在web.xml中的連線引數的值 配置檔案web.xml中的程式碼 <!-- 這是全域性的資料庫連線引數配置 --> <context-param> <param-name>
spring boot 程式碼、註解配置獲取yml、properties檔案中的map即鍵值對
一、yml獲取自定義鍵值對 yml中的鍵值對 test: map: key1: value1 key2: value2 key3: value3 pom中的依賴配置 <dependency> <groupId>org.sprin
使用FFMPEG從MP4封裝中提取視訊流到H264檔案
命令列: ffmpeg -i 20130312_133313.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 20130312_133313.264 說明: -i 20130312_133313.mp4 :是輸入的MP4檔