一、基本概念
1. I/B/P幀
I幀是內部編碼幀,是一個完整的畫面,P幀是前向參考幀,B幀是雙向參考幀。
由於I幀是一個完整的圖片,P幀只保留相對於I幀變得部分,它的壓縮比是I幀的50%;
B幀前后的幀都會引用,壓縮比大概是I幀的50%;
2. I幀和IDR幀(關鍵幀)的區別
I和IDR幀都是使用幀內預測的。IDR幀的作用是立刻刷新,使錯誤不致傳播,從IDR幀開始,重新算一個新的序列開始編碼。而I幀不具有隨機訪問的能力,這個功能是由IDR承擔。IDR會導致DPB(DecodedPictureBuffer 參考幀列表——這是關鍵所在)清空,而I幀不會。IDR圖像一定是I圖像,但I圖像不一定是IDR圖像。一個序列中可以有很多的I圖像,I圖像之后的圖像可以引用I圖像之間的圖像做運動參考。
對於IDR幀來說,在IDR幀之后的所有幀都不能引用任何IDR幀之前的幀的內容,與此相反,對於普通的I幀來說,位於其之后的B/P幀可以引用位於普通I幀之前的I幀。從隨機存取的視頻流中,播放器永遠可以從一個IDR幀播放,因為在它之后沒有任何幀引用之前的幀。但是,不能在一個沒有IDR幀的視頻中從任意點開始播放,因為后面的幀總是會引用前面的幀。
3. PTS和DTS
PTS:Presentation time stamp.
DTS:Decode time stamp.
如果視頻中全部是I幀和P幀,那么PTS和DTS都是單調遞增的。如果有B幀,因為它要引用后面的P幀和前面的I幀。DTS的順序是1342,PTS的順序是1234.

二、視頻傳輸
從網絡上接收視頻時首先要解協議(RTSP/RTMP/HTTP),然后是解封裝格式(MKV,RMVB),之后才是將視頻(H264)和音頻(AAC)格式數據分別解碼為圖像(RGB/YUV)和聲音(PCM),再根據時間戳同步播放。
RTSP+RTP主要用於IPTV,原因是傳輸數據使用的是UDP,在網絡環境比較穩定的情況下,傳輸效率是比較高的;
RTMP主要用於互聯網音視頻傳輸,它使用的是TCP傳輸,因為互聯網環境相對較差,采用RTMP保證了視頻的傳輸質量,但是其傳輸延遲相對較高,傳輸效率相對較低。
使用RTMP技術的流媒體系統有一個非常明顯的特點:使用 Flash Player 作為播放器客戶端,而Flash Player 現在已經安裝在了全世界將近99%的PC上,因此一般情況下收看RTMP流媒體系統的視音頻是不需要安裝插件的。用戶只需要打開網頁,就可以直接收看流媒體,十分方便。直播服務普遍采用了RTMP作為流媒體協議,FLV作為封裝格式,H.264作為視頻編碼格式,AAC作為音頻編碼格式。FLV是RTMP使用的封裝格式,H.264是當今實際應用中編碼效率最高的視頻編碼標准,AAC則是當今實際應用中編碼效率最高的音頻編碼標准。
librtmp是RTMP協議的實現,可以使用librtmp來實現協議的解析和數據的收發。直播服務器可以基於nginx+rtmp實現;直播客戶端方面采用librtmp負責推流,FFmpeg負責編碼。
| 全稱 | 協議 | 原理 | 延時 | |
| RTMP | Real time messaging protocol | 長連接tcp | 每個時刻的數據,收到后立即轉發 | 1~3s |
| HLS | Http live streaming | 短連接http | 集合一段時間的數據生成ts文件,更新m3u8 | >10s |
| HTTP-FLV | RTMP over http | 長連接http | 同RTMP,使用http | 1~3s |
三、視頻壓縮
- 視頻壓縮分為有損壓縮和無損壓縮。
無損壓縮是采用一些壓縮算法壓縮視頻,但是壓縮完畢后還能夠真實的還原原始數據;
有損壓縮是借助於人眼的一些特性,丟棄一些特定的數據,但是壓縮完畢后的視頻效果還在人眼可以接受的范圍內的特定數據。
- 視頻壓縮編碼的主要原理是:
幀內編碼(變換編碼和熵編碼):像素點之間存在相關性。圖像變換到頻域可以實現去相關和能量集中。
幀間編碼(運動估計和運動補償):將圖像划分為一個個小區塊,進行預測。
3.參考資料:
http://blog.csdn.net/leixiaohua1020/article/details/18893769
