音視訊學習筆記(一)

PeachRain發表於2017-12-14

其實關於音視訊的技術有很多很多的內容,本筆記最後的目標是為了製作一個FFMPEG為基礎的移動端跨平臺的播放器。 在學習基本之前,首先最主要的是瞭解解碼編碼的機制,音視訊的碼流結構等。 其實視訊的播放就是在畫面上快速顯示每一幀的圖片,而圖片就是來自於封裝好的視訊檔案裡(mkv,mp4,avi,flv等等)。

image.png
最終顯示到螢幕上的就是解碼以後的資料(YUV)等。 所以製作播放器的要點就是穩定的解碼各種格式轉換成YUV等的顯示格式,當然音訊也是一樣的,音訊(PCM)。 現在比較主流的封裝格式:視訊(基於H.264),音訊(基於AAC),首先是諒解這兩種格式 H.264:

原理:H.264原始碼流(又稱為“裸流”)是由一個一個的NALU組成的。他們的結構如下圖所示。

音視訊學習筆記(一)
其中每個NALU之間通過startcode(起始碼)進行分隔,起始碼分成兩種:0x000001(3Byte)或者0x00000001(4Byte)。如果NALU對應的Slice為一幀的開始就用0x00000001,否則就用0x000001。H.264碼流解析的步驟就是首先從碼流中搜尋0x000001和0x00000001,分離出NALU;然後再分析NALU的各個欄位。本文的程式即實現了上述的兩個步驟。

AAC:

image.png
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

AAC原始碼流(又稱為“裸流”)是由一個一個的ADTS frame組成的。他們的結構如下圖所示。

音視訊學習筆記(一)
其中每個ADTS frame之間通過syncword(同步字)進行分隔。同步字為0xFFF(二進位制“111111111111”)。AAC碼流解析的步驟就是首先從碼流中搜尋0x0FFF,分離出ADTS frame;然後再分析ADTS frame的首部各個欄位。本文的程式即實現了上述的兩個步驟。

所以如何從格式中擷取每一幀 的資料就是首先要完成的任務了。 當然我們現實中看到的mkv,mp4,avi,FLV等等的格式大部分是基於H.264的封裝,封裝結構各不相同。FLV:

FLV封裝原理 FLV(Flash Video)是Adobe公司設計開發的一種流行的流媒體格式,由於其視訊檔案體積輕巧、封裝簡單等特點,使其很適合在網際網路上進行應用。此外,FLV可以使用Flash Player進行播放,而Flash Player外掛已經安裝在全世界絕大部分瀏覽器上,這使得通過網頁播放FLV視訊十分容易。目前主流的視訊網站如優酷網,土豆網,樂視網等網站無一例外地使用了FLV格式。FLV封裝格式的檔案字尾通常為“.flv”。 總體上看,FLV包括檔案頭(File Header)和檔案體(File Body)兩部分,其中檔案體由一系列的Tag組成。因此一個FLV檔案是如圖1結構。

音視訊學習筆記(一)
圖1.檔案結構(簡圖) 其中,每個Tag前面還包含了Previous Tag Size欄位,表示前面一個Tag的大小。Tag的型別可以是視訊、音訊和Script,每個Tag只能包含以上三種型別的資料中的一種。圖2展示了FLV檔案的詳細結構。
音視訊學習筆記(一)
圖2.FLV檔案結構(詳圖) 下面詳細介紹一下三種Tag的Tag Data部分的結構。 (a)Audio Tag Data結構(音訊Tag) 音訊Tag開始的第1個位元組包含了音訊資料的引數資訊,從第2個位元組開始為音訊流資料。結構如圖3所示。
音視訊學習筆記(一)
圖3.Audio Tag Data結構 第1個位元組的前4位的數值表示了音訊編碼型別。如表1所示。 表1.音訊編碼型別 涵義(原帖):http://blog.csdn.net/leixiaohua1020/article/details/17934487 可以獲取該格式資源然後基於H.264解封裝,然後再解碼。而這部分也就是FFMPEG會幫我們做的事情。

相關文章