android音影片基礎
一、編碼目的
編碼的目的:壓縮,各種音影片的編碼方式就是為了讓影片體積更小,有利於儲存和傳輸。編碼的核心四想就是去除冗餘資訊。
二、編碼思路
1.空間冗餘
影象內部相鄰元素之間存在較強的相關性,造成資訊的冗餘。(一塊區域顏色一樣)
2.時間冗餘
相鄰影片幀具有較大的相關性,造成資訊的冗餘。(第一幀和第二幀絕大多數資料一樣)
3. 視覺冗餘
人類不敏感的資訊可以去除。(紅色偏點橘色)
4.資訊熵冗餘 == 熵編碼-哈夫曼演算法
也稱編碼冗餘,人們用於表達某一資訊所需要的位元數總比理論上表示該資訊所需要的最少位元數要大,它們之間的差距就是資訊熵冗餘,或稱編碼冗餘。
5.知識冗餘 == 人類(頭 身體 腿),汽車,房子 不需要記錄
是指在有些影象中還包含與某些驗證知識有關的資訊。
6.I幀、P幀、B幀壓縮思路
I幀:幀內編碼幀,關鍵幀,I幀可以看作一個影象經過壓縮之後的產物,可以單獨解碼出一個完整的影象;(壓縮率最低)
P幀:前向預測/參考 編碼幀,記錄了本幀跟之前的一個關鍵幀(或P幀)的差別,解碼時需要用之前快取的畫面疊加上本幀定義的差別,生成最終畫面。 (壓縮率比I幀高,比B幀低 屬於 適中情況)
B幀:雙向預測/參考 編碼幀,記錄了本幀與前後幀的差別,解碼需要參考前面一個I幀或者P幀,同時也需要後面的P幀才能解碼一張完整的影象。 (參考前後的預測得到的,壓縮率是最高,但是耗時)
三、編碼標準
1.組織
- 國際電信聯盟:H.264、H.265
- MPEG系列標準:MPEG1、MPEG2、MPEG4、AVC
AVC == H.264
HEVC == H.265
2.影片編碼概念
通過指定的壓縮技術,把某一種影片格式檔案,轉換成另一種影片檔案格式檔案的方式。
3. H.264分層結構(VCL和NAL)
-
VCL
VCL(viedo coding layer,影片編碼層):負責高效的影片內容展示。
VCL資料:編碼處理的輸出,被壓縮編碼後的影片資料序列。
-
NAL
NAL(Network Abstraction Layer,網路提取層):以網路所要求的恰當方式對資料進行打包傳送,是傳輸層。不管是網路還是本地都需要通過這一層來傳輸。
NAL = 一個位元組的片頭 + 若干的片資料
傳輸的是NAL
4. H.264的輸出結構
H.264編碼器預設的輸出為:起始碼+NALU。
起始碼:0x00000001和0x000001
0x00000001:NALU裡有狠多片
0x000001:NALU裡只有一片。
5.舉例分析H.264檔案格式。
```java SPS 序列引數集(記錄有多少I幀,多少B幀,多少P幀,幀是如何排列) == 7 00 00 00 01 67,0x67 ---> 2進位制01100111 ---> 取低五位 00000111 ---> 十六進位制 0x07
PPS 影象引數集(影象寬高資訊等) == 8 00 00 00 01 68, 0x68 ---> 2進位制01101000---> 取低五位 00001000 ---> 十六進位制 0x08
SEI補充資訊單元(可以記錄座標資訊,人員資訊, 後面解碼的時候,可以通過程式碼獲取此資訊)http://blog.csdn.net/y601500359/article/details/80943990 00 00 01 06 , 0x06 ---> 2進位制00000110---> 取低五位00000110 ---> 十六進位制 0x06
I幀 00 00 00 65, 0x65 ---> 2進位制01100101---> 取低五位00000101 ---> 十六進位制 0x05 最終是 5 I幀完整畫面出來
P幀 61 -->0x01 重要P幀 41 -->0x01 非重要P幀
B幀 01 -->0x01 B幀
```
6.PTS和DTS
DTS:解碼時間戳,在什麼時候解碼這一幀的資料。
PTS:顯示時間戳,在什麼時候顯示這一幀資料。
在沒有B幀的時候,DTS和PTS是一樣的順序。
因為B幀的解碼需要靠前一幀和後一幀,只要有B幀DTS和PTS就一定會亂。
GOP:I幀+ 下一個I幀之前的所有B幀和P幀。
java
i幀=GOP是什麼理解的?
SPS PPS I P B P B P B P B I 一組 SPS PPS I P B P B P B P B I 二組