1. 程式人生 > >在MP4檔案中提取H264的SPS、PPS及碼流

在MP4檔案中提取H264的SPS、PPS及碼流

一、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.例項分析

用mp4info檢視如下:

用winhex分析如下:

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 TYPE為6D 64 61 74


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為 67 64 00 1F AC D3 07 82 FF 97 02 10 00 00 03 00 10 00 00 03 03 29 F1 83 13 80

PPS為 68 EA EC B2 2C

四、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]


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

3  【定義】 NALU header


特別的,當值為7和8分別為SPS和PPS。 畢書上的定義為:

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

 

相關推薦

MP4檔案提取H264的SPSPPS

一、MP4封裝格式的基本概念 1  MP4封裝格式對應標準為 ISO/IEC 14496-12(資訊科技 視聽物件編碼的第12部分: ISO 基本媒體檔案格式/Information technology Coding of audio-visual objects Pa

使用FFmpeg的SDK庫實現將H.264封裝進MP4檔案時全域性SPSPPSSPSPPS衝突的問題

一、問題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的 SPSPPS獲取

【流媒體】H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流 SkySeraph Apr 1st 2012  Email:[email protected].com  一、MP4格式基本概念 MP4格式對應標準MPEG-4標準(ISO/IEC14496) 二、MP4封裝格式核

mybatis xml檔案的大於小於like模糊查詢的寫法

在xml中,特殊符號的轉義寫法如下: &lt; < &gt; > &lt;&gt; <> &amp; & &

如何從wordexcelpdf等檔案提取文字(Tika)

Tika-內容分析工具包 官方網站:https://tika.apache.org/ 在maven倉庫下載最新版依賴 https://mvnrepository.com/artifact/org.apache.tika/tika-parsers 懶得去的同學,提供一個筆者正在使

使用FFMPEG從MP4封裝提取視訊流到H264檔案

命令列: ffmpeg -i 20130312_133313.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 20130312_133313.264 說明:  -i 20130312_133313.mp4 :是輸入的MP4檔

使用FFMPEG從MP4封裝提取視訊流到.264檔案

命令列: ffmpeg -i 20130312_133313.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 20130312_133313.264 說明:  -i 20130312_133313.mp4 :是輸入的MP4檔案

一行命令從 APK 檔案提取 Endpoint URL

做IoT的人免不了要接觸Android,接觸Android的人又免不了要研究別人的App應用。Diggy,一款能夠從 apk 檔案中提取 endpoint 及 URL 的工具,只要一行命令就可以幫大家提取出相關Android apk檔案的安裝資訊和網際網路訪問資訊。下載地址:

MP4頭資訊提取sps和pps資料

一、MP4格式基本概念 MP4格式對應標準MPEG-4標準(ISO/IEC14496) 二、MP4封裝格式核心概念 1  MP4封裝格式對應標準為 ISO/IEC 14496-12(資訊科技 視聽物件編碼的第12部分: ISO 基本媒體檔案格式/Informati

ionic創建工程遇到異常錯誤解決方法

右鍵 ive hub reac 個推 註意 code down 添加 1. 創建工程——download failed ionic start myApp tabs 遇到如下錯誤 Downloading--Failed! Error:Timeout of 25000m

[SimplePlayer] 4. 從視訊檔案提取音訊

提取音訊,具體點來說就是提取音訊幀。提取方法與從視訊檔案中提取影象的方法基本一樣,這裡僅列出其中的不同點: 1. 由於目的提取音訊,因此在demux的時候需要指定的是提取audio stream AudioStream = av_find_best_stream(pFormatCtx, AVMEDIA_T

對tensorflow的tensorplaceholderfeed_dict的理解

以前不知道tf.placeholder的feed_dict格式要求,以為隨便是什麼格式都可以,直到自己在做測試的時候出現以下錯誤才知道tf.placeholder  的feed_dict填充內容不可以是tensor格式的,對自己來說反而方便很多。 TypeError: The valu

MyBatis xml檔案的大於小於等符號寫法

在SQL中我們經常會使用到比較的情況,然而在使用Mybatis中XML檔案時,>、<等符號是不能直接使用的,因此,我們需要進行特殊處理。下面介紹兩種處理方式: 第一種:使用特殊符號轉意的寫法   &lt;       &

按空格和按換行從檔案提取資料

1,讀取檔案的類為ifstream,其中“i”代表“in”,針對變數而言,ifstream所在的標頭檔案為fstream; 2,ifstream中有open方法,可以開啟檔案; 3,ifstream中有>>方法,可以以空格為分割符,以換行為結束符讀取資料; 4,iostrea

Jsoup文件--提取資料(元素提取屬性文字和HTML)

元素中提取屬性、文字和HTML 問題 完成解析文件並找到一些元素後,想要從這些元素中獲取資料。 解決方案 獲取屬性值:使用Node.attr(String key)方法 獲取文字:使用Element.text() 獲取HTML:使用Element.html()

java 從字串提取鄉等區域名稱(包含少數民族地區)

近期寫的一個專案,需要從IOS和Android傳來的一個字串提取省、市、區等區域名稱,於是就整理了一個工具類,程式碼如下: import java.util.ArrayList; import java.util.LinkedHashMap; import java.u

如何用Python從PDF檔案提取文字詞彙

在日常工作中,有時可能需要解析一些 PDF 檔案,提取檔案中的關鍵詞,好讓它們能夠被我們搜尋。解決這個問題的重要部分就是找到如何從 PDF 檔案中提取文字資料的方法。從如果是幾張或者幾十張倒還好辦,那要是幾百幾千張,可能就有點麻煩了。 幸好我們可以用 Python 完成這項工作。下面就分享

RabbitMQ3.7.8在win10的安裝配置使用

1、配套檔案 2、RabbitMQ服務端程式碼是使用併發式語言Erlang編寫的,安裝Rabbit MQ的前提是安裝Erlang,雙擊otp_win64_21.1.exe直接安裝,選擇預設配置即可,如果不安裝Erlang或安裝錯誤而直接安裝RabbitMQ會彈出

從H264/H265獲取寬幀率

在做碼流分析時,影象解析度、幀率這類的基本資訊,當然不可少。本文介紹如何從NAL中計算到影象寬、高,還有解析度。於是H264和H265有相似性,就在一起寫了。 一、從碼流獲得寬、高 1、H264 寬高可從SPS欄位計算得到,公式如下: Width = (pic_width_in_mb