FFmpeg H264碼流格式說明

背景知識

IDR: 在H.264中,圖像以序列爲單位進行組織。一個序列的第一個圖像叫做 IDR 圖像(立即刷新圖像),IDR 圖像都是 I 幀圖像。H.264 引入 IDR 圖像是爲了解碼的重同步,當解碼器解碼到 IDR 圖像時,立即將參考幀隊列清空,將已解碼的數據全部輸出或拋棄,重新查找參數集,開始一個新的序列。這樣,如果前一個序列出現重大錯誤,在這裏可以獲得重新同步的機會。IDR圖像之後的圖像永遠不會使用IDR之前的圖像的數據來解碼。IDR 圖像一定是 I 圖像,但 I 圖像不一定是 IDR 圖像。I幀之後的圖像有可能會使用I幀之前的圖像做運動參考。


NALU類型
       標識NAL單元中的RBSP數據類型,其中,nal_unit_type爲1, 2, 3, 4, 5及12的NAL單元稱爲VCL的NAL單元,其他類型的NAL單元爲非VCL的NAL單元。
0:未規定
1:非IDR圖像中不採用數據劃分的片段
2:非IDR圖像中A類數據劃分片段
3:非IDR圖像中B類數據劃分片段
4:非IDR圖像中C類數據劃分片段
5:IDR圖像的片段
6:補充增強信息 (SEI)
7:序列參數集
8:圖像參數集
9:分割符
10:序列結束符
11:流結束符
12:填充數據
13 – 23:保留
24 – 31:未規定

av_read_frame函數打印當前接收的NALU單元的類型
nal_unit_type: 7, nal_ref_idc: 3
nal_unit_type: 8, nal_ref_idc: 3
nal_unit_type: 6, nal_ref_idc: 0
nal_unit_type: 5, nal_ref_idc: 3
說明I幀前面就會有SPS/PPS圖像參數的相關信息,實際上當收到I幀,也就可以解碼出圖像(會根據前面的SPS/PPS參數進行解碼參數的設置),雖然FFmpeg內部會緩衝幾幀,但是緩衝的幀速度還是
很快的根本不需要考慮延時
當然,如果是播放文件的話,在播放結束後,要想取出來就需要傳遞空的AVPacket進去,需要調用avcodec_send_packet(pAVCodecContext, NULL)
才能夠播放完畢


參考
http://www.bubuko.com/infodetail-2106896.html
https://www.cnblogs.com/lidabo/p/4582040.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章