2013-12-17 61 views
2

我已經使用HM-12.0參考代碼創建了基本bin流。所以輸出是HEVC編碼的bin流(比如input.bin)。HEVC:從輸入bin流中獲取輸入寬度和高度

我有一個任務涉及讀取這個基本流的頭。這是我需要從input.bin文件中獲取諸如流寬,高度等信息。

看到大量流之後,我可以斷定,所有這些斌流從序列開始:

00 00 00 01 

所以每當我看到任何斌流這個順序,我可以說,這個流必須由HEVC解碼器解碼。

此外,如果我想從input.bin(如ffmpeg中的ff_raw_video_read_header函數)獲取寬度,高度,fps等,那麼需要執行哪些步驟來獲取此信息?

我已經經歷了HEVC草案的解析部分,但它對於我在視頻領域的水平來說非常複雜。任何人都可以提出一個簡單的方法來從編碼的bin文件中獲取所需的信息?

任何建議將對我很有幫助。提前致謝。

+2

FYI 00000001是H.264標準附錄B中定義的起始碼。只看開始代碼並不能告訴你你正在處理什麼類型的流,即H.264或H.265。 – Ralf

+0

尊敬的@Zax,您如何分析比特流文件?你有任何可用的代碼? – zinon

回答

5

最近我看到你問了很多關於視頻的問題。談到視頻;沒有這種「簡單的方式」。

這是AVC的答案。 Fetching the dimensions of a H264Video stream

首先,fps通常不在ES中編碼。這是一個容器級的事情。在AVC/HEVC中有一個位置,但不應該指望它被填充。

您已經找到起始碼。對於記錄,起始碼是2或更多00,但是01(它並不總是00 00 00 01,它可以是00 00 01,00 00 00 00 01等)。如果該序列曾出現在NALU中自然,它必須逃脫。所以,當編碼一個00 00 01和一個NALU有效載荷時,它將被改爲00 00 03 01.我提到這一點,因爲如果你在解析時遇到這個序列,你必須忽略emulation prevention字節(03)的存在。刪除emulation prevention字節的ES稱爲原始字節序列有效負載(rbsp)

開始代碼之後的前兩個字節具有nal_unit_header。該類型存儲位1-5 ((NALU[0] >> 1) & 0x3F)。解決方案存儲在SPS_NUT中,它是33.一旦擁有SPS,就可以解析它。

這給我們帶來了指數golomb編碼。基本上一個exponential golomb encoded整數(縮寫爲ue的無符號數,或者se代表有符號數)是一個可變長整數。解碼你計數前導零。這個計數會告訴你以位爲單位的整數長度。接下來,你讀了很多位並減去1來得到你的整數。簽署的變體是一樣的,excep最後一位是例如符號位:

1  = 0 = 0 
010 = 1 = 1 
011 = 2 = -1 
00100 = 3 = 2 
00101 = 4 = -2 

下一頁使用表解析SPS在拍攝的7.3.2.2。 ITU-T H.265(04/2013)(第33頁)

而且,您可以很好地計算pic_width_in_luma_samples pic_height_in_luma_samples和conformance_window參數中的滯留。

+0

它是一個非常好的解釋。除HEVC標準草案之外,您還可以從哪裏閱讀這些內容?請提供一些網站或一些材料的鏈接。對我和對本網站的任何人都有幫助。 – Zax

+1

多年的視頻體驗。它很難找到所有這些信息。書籍,互聯網,國際電聯文檔和逆向工程是我學習東西的地方。 – szatmary

+0

開始的最佳地點確實是參考編解碼器。在調試器中加載調試變體並開始執行代碼... –