碼流格式: Annex-B, AVCC(H.264)與HVCC(H.265), extradata詳解(轉)

原文:http://www.taodudu.cc/news/show-6091235.html?action=onClick

1.前言

介紹H.264結構的文章鋪天蓋地,無責任翻譯、無責任轉載以及部分經驗之談(目前搜索最靠前的一篇實際是對stackoverflow上答案的翻譯。。鏈接後面給出了),所以缺的不是資料,是敘述準確的資料。來吧,看這篇整理就夠了。

2.典型問題

iOS 硬解264視頻(MP4),出現綠屏,或上半部分正常下半部分綠屏。
iOS 硬解265視頻,同樣也要解決的extradata處理問題。
參:iOS11 VideoToolbox硬解HEVC

首先來看兩種格式:

3.Annex-B 和 AVCC/HVCC

H.264碼流分Annex-B和AVCC兩種格式。
H.265碼流是Annex-B和HVCC格式。
(以下內容針對H.264,但大體也適用於H.265/HEVC)

3.1別名

  • AVCC格式 也叫AVC1格式,MPEG-4格式,字節對齊,因此也叫Byte-Stream Format。用於mp4/flv/mkv, VideoToolbox。
  • Annex-B格式 也叫MPEG-2 transport stream format格式(ts格式), ElementaryStream格式。

Annex-B 附錄B, 指ITU-T的 Recommendation(h.264和h.265)在附錄B中規定碼流格式。

3.2 結構上的區別:

區別有兩點:一個是參數集(SPS, PPS)組織格式;一個是分隔。
- Annex-B:使用start code分隔NAL(start code爲三字節或四字節,0x000001或0x00000001,一般是四字節);SPS和PPS按流的方式寫在頭部。
- AVCC:使用NALU長度(固定字節,通常爲4字節)分隔NAL;在頭部包含extradata(或sequence header)的結構體。(extradata包含分隔的字節數、SPS和PPS,具體結構見下)

3.2.1 Annex B

 

3.2.2 extradata

H.264/AVC extradata 語法

參考:《ISO/IEC 14496-15 NAL unit structured video》AVCDecoderConfigurationRecord結構:(最小長度7字節)

 說明:
FFmpeg中,extradata解析,見ff_h264_decode_extradata()

注意:
第5字節的最後2位,表示的就是NAL size的字節數。在AVCC格式中,每個NAL前面都會有NAL size字段。NAL size可能是1字節、2字節或4字節(4字節較常見),解析extradata重要目的就是確認這個值。(而Annex-B格式,要split NAL,只要去探測0x000001就可以了)

H.264 extradata 示例(AVCC格式)

05| FF          NAL size:  4字節
06| E1          SPS num:   1
07| 00 1F       SPS size:  31字節
09| 67          NAL type:  SPS
40| 01          PPS num:   1
41| 00 05       PPS size:  5字節
42| 68          NAL type:  PPS

H.265/HEVC extradata語法

參照HEVCDecoderConfigurationRecord:(最小長度23字節)

HEVC extradata 示例(HVCC格式)

 

 

3.3 實踐

VideoToolbox 與 AVCC格式 1

硬解 僅支持avcC格式。 如ES格式,需要轉爲MPEG-4格式 P58
硬編 輸出avcC格式。 P204

MediaCodec 與 Annex-B格式

硬解 支持Annex-B格式,avcC需要做轉換,NALU長度替換爲start code

Annex-B 轉 AVCC 2

對於僅接受AVCC格式的播放器(如Quicktime v7.0),需要進行convert Annex-B to AVCC:
- start code 轉爲4字節 NAL size
- SPS, PPS創建 extradata

AVCC 轉 Annex-B

FFmpeg “extract_extradata” bitstream filter: 3
h264碼流轉換:
ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts
hevc碼流轉換:
ffmpeg -i INPUT.mp4 -codec copy -bsf:v hevc_mp4toannexb OUTPUT.ts

4. 後續

瞭解了H.264 extradata以及NAL組織結構,自然引出H.264碼流結構的議題,下篇乾脆系統分析下H.264, HEVC碼流結構。

 

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