日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【流媒体】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【流媒体】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、MP4格式基本概念

MP4格式對應標準MPEG-4標準(ISO/IEC14496)

二、MP4封裝格式核心概念

  • MP4封裝格式對應標準為 ISO/IEC 14496-12(信息技術 視聽對象編碼的第12部分: ISO 基本媒體文件格式/Information technology Coding of audio-visual objects Part 12: ISO base media file format)
    附-- 標準免費下載:PubliclyAvailableStandards
  • MP4封裝格式是基于QuickTime容器格式定義,媒體描述與媒體數據分開,目前被廣泛應用于封裝h.264視頻和ACC音頻,是高清視頻/HDV的代表。
  • MP4文件中所有數據都封裝在box中(對應QuickTime中的atom),即MP4文件是由若干個box組成,每個box有長度和類型,每個box中還可以包含另外的子box(稱container box)。
    一個MP4文件首先會有且只有一個“ftyp”類型的box,作為MP4格式的標志并包含關于文件的一些信息;之后會有且只有一個“moov”類型的box(Movie Box),它是一種container box,子box包含了媒體的metadata信息;MP4文件的媒體數據包含在“mdat”類型的box(Midia Data Box)中,該類型的box也是container box,可以有多個,也可以沒有(當媒體數據全部引用其他文件時),媒體數據的結構由metadata進行描述。
  • MP4中box存儲方式為大端模式。一般,標準的box開頭會有四個字節的box size。
  • 幾個名詞
  • track表示一些sample的集合,對于媒體數據來說,track表示一個視頻或音頻序列。
    hint track特殊的track,并不包含媒體數據,包含的是一些將其他數據track打包成流媒體的指示信息。
    sample對于非hint track來說,video sample即為一幀視頻,或一組連續視頻幀,audio sample即為一段連續的壓縮音頻,它們統稱sample。對于hint track,sample定義一個或多個流媒體包的格式。
    sample table指明sampe時序和物理布局的表。
    chunk一個track的幾個sample組成的單元。

    三、MP4封裝格式結構圖

  • 實例樣本
    來源于Android MediaRecoder視頻錄制,平臺為華為T8300和TCL968,用mp4info查看如下:
  • 用EsEYE查看如下:

    用winhex分析如下:

  • box結構圖
  • 接下來對h264編碼中有用的幾個進行闡述,其它不再描述。

  • ftyp(file type box)
    如下圖所示,開始的四字節00 00 00 00 18表示該box的size為24字節(含頭),然后66 74 79 70是ftyp的BOX TYPE,其它是一些格式兼容等相關信息。
  • mdat
    如下圖所示,BOX YPE為6D 64 61 74 ,緊接著的00 00 09 39表示sliece長度
  • avcC
    如下圖所示,紅色為BOX TYPE
  • 四、MP4文件中h264的 SPS、PPS獲取

  • 【參考依據】ISO/IEC 14496-15
  • 【綜述】在H264中,SPS和PPS存在于NALU header中,而在MP4文件中,SPS和PPS存在于AVCDecoderConfigurationRecord, 首先要定位avcC.
  • 【定義】
    ①參數集:一組很少改變的,為大量VCL NALU 提供解碼信息的數據。
    序列參數集SPS作用于一系列連續的編碼圖像,而圖像參數集PPS作用于編碼視頻序列中一個或多個獨立的圖像。
    如果解碼器沒能正確接收到這兩個參數集,那么其他NALU 也是無法解碼的。因此它們一般在發送其它 NALU 之前發送,并且使用不同的信道或者更加可靠的傳輸協議(如TCP)進行傳輸,也可以重復傳輸。
    ②關于AVCDecoderConfigurationRecord結構定義為:
  • 4. 【實例分析】 數據如上avcC圖所示,現在對數據進行詳細分析

    所以,提取的SPS和PPS分別為67 42 00 1E A6 81 41 F9和68 CE 38 80

    五、MP4文件中的H264 data /NALU slice

  • 【參考】H264官方文檔 + 畢書—新一代視頻壓縮編碼標準
  • 【綜述】
    ① 在MP4格式文件中,H264 slice并不是以00 00 00 01來作分割,而是存儲在mdat box中。
    ② H264基本碼流由一些列的NALU組成。原始的NALU單元組成:[start code] + [NALU header] + [NALU payload]
  • start code1字節00 00 01 或 00 00 00 01需要添加的
    NALU header1字節如下3通過mdat定位

    ③ H264基本碼流結構分兩層:視頻編碼層VCL和網絡適配層NAL,這樣使信號處理和網路傳輸分離

    VCL負責高效視頻內容表示
    NAL以網絡所要求的恰當方式對數據進行打包和發送
  • 【定義】 NALU header
  • +---------------+

    |0|1|2|3|4|5|6|7|

    +-+-+-+-+-+-+-+

    |F|NRI| Type |

    +---------------+

    特別的,當值為7和8分別為SPS和PPS。

    畢書(P191)上的定義為:

  • 【實例分析】數據分析,數據如上圖mdat所示
  • 6D 64 61 74mdat BOX TYPE
    00 00 09 39silce長度,2361
    接下來的65就是NALU header,可以由65&0x1F來求的后五個bit,從而得知此slice為I frame

    注意,mdat與silce之間有可能存在若干占位符,我在TCL手機測試時就出現了連續的00的占位符,這樣后面用H264硬編碼時會比較麻煩一點。

    Ref/Related
    1 相關資料和工具在文中鏈接下載
    2 http://www.52rd.com/Blog/wqyuwss/559/4/
    3 http://blog.csdn.net/szu030606/article/details/5943279
    4 http://blog.csdn.net/k1988/article/details/5654631
    5 http://www.cppblog.com/czanyou/archive/2008/11/26/67940.html
    6 http://krdai.info/blog/sps-pps-in-mp4-format.html
    7 http://www.cnitblog.com/zouzheng/archive/2007/04/04/25155.html
    8 http://bbs.chinavideo.org/viewthread.php?tid=10273

    作者:skyseraph
    出處:http://www.cnblogs.com/skyseraph/
    更多精彩請直接訪問SkySeraph個人站點:http://skyseraph.com//
    Email/GTalk: zgzhaobo@gmail.com
    本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

    總結

    以上是生活随笔為你收集整理的【流媒体】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。