2013-07-09 157 views
2

正如大家都知道的,在Smooth Stream客戶端清單文件中,視頻標籤中包含一個「CodecPrivateData」屬性。現在經過我的初步調查,我發現這個字符串是通過使用基本上是NAL單元的SPS和PPS形成的。如何在mp4的H264編解碼器中查找SPS和PPS字符串

我正在尋找一種方法來從視頻中提取GOP的信息,這樣我就可以使用相同的創建清單文件和手動替代編解碼器私有數據

基本上,我期待着創建自定義應用使用ffmpeg創建平滑表示

+0

只是澄清,所以你想使用ffmpeg以編程方式從.mp4容器中提取SPS和PPS,或者這是從一個.mp4文件中一次性提取SPS/PPS? – Aki

+0

說實話,ffmpeg只是一個選項,如果還有其他工具可以幫助我從mp4獲得SPS/PPS,那麼我會好的。關於你的問題,不知道我是否理解正確。但我無論如何,我只需要從MP4提取SPS和PPS – Tarun

回答

11

請注意,SPS/PPS與mp4文件中的視頻軌道分開存儲在全局標頭之一(全局標頭的avcC部分)中。

下面是格式: 8+字節根據ISO/IEC 14496-10

    = long unsigned offset + long ASCII text string 'avcC' 
       -> 1 byte version = 8-bit hex version (current = 1) 
       -> 1 byte H.264 profile = 8-bit unsigned stream profile 
       -> 1 byte H.264 compatible profiles = 8-bit hex flags 
       -> 1 byte H.264 level = 8-bit unsigned stream level 
       -> 1 1/2 nibble reserved = 6-bit unsigned value set to 63 
       -> 1/2 nibble NAL length = 2-bit length byte size type 
        - 1 byte = 0 ; 2 bytes = 1 ; 4 bytes = 3 
       -> 1 byte number of SPS = 8-bit unsigned total 
       -> 2+ bytes SPS length = short unsigned length 
       -> + SPS NAL unit = hexdump 
       -> 1 byte number of PPS = 8-bit unsigned total 
       -> 2+ bytes PPS length = short unsigned length 
       -> + PPS NAL unit = hexdump 

如果你只是想從一個單一的MP4提取SPS/PPS,您可以用十六進制編輯器,並獲得SPS/PPS,根據上述MP4格式規格進行檢查(通過從文件末尾搜索查找「avcC」字符串);然後將SPS/PPS字節添加到您使用的c樣式數組中。

否則,您可以使用ffmpeg和h264bitstream實用程序來提取SPS/PPS。在命令行上第一運行FFMPEG提取h264碼流:

ffmpeg -i my_funny_video.mp4 -vcodec copy -vbsf h264_mp4toannexb -an my_funny_video.h264 

然後從h264bitstream實用程序運行h264_analyze:

h264_analyze my_funny_video.h264 

這將產品在您的SPS/PPS和其他的NAL的詳細分析。

+0

我不知道如何使用ffmpeg來提取SPS/PPS?如果你也可以引導,這將是非常有利的嗎? – Tarun

+0

此外,我能夠使用C#跟蹤SPS和PPS,但分析後發現PPS/SPS字符串長度可能因視頻而異。他們是否遵循任何模式 – Tarun