2011-08-17 183 views
2

民間,什麼是視頻編解碼器的解碼輸出?

我想知道如果有人可以向我解釋什麼是視頻解碼的輸出。假設這是一個MP4容器中的H.264流。

從屏幕上顯示的東西,我想解碼器可提供兩種不同類型的輸出:

  1. 點 - (X,Y)的位置和(R,G,B)顏色的座標像素
  2. 矩形(X,Y,W,H)單位爲矩形和(R,G,B)顏色來顯示

還有時間戳的問題。

您能指點我或指出解碼器生成的內容的正確鏈接,以及視頻客戶端如何使用此信息在屏幕上顯示內容?

我打算下載VideoLAN源並檢查它,但一些解釋會有幫助。

非常感謝您的幫助。

問候, 彼得

回答

4

以上皆非。

通常,輸出將是隻包含顏色數據的字節流。 X,Y位置由視頻的尺寸所暗示。

換句話說,前三個字節可能在(0,0)處編碼顏色值,在(0,1)處編碼值的第二個三字節等等。某些格式可能使用四個字節組,或者甚至不加一個字節的位數 - 例如,如果每個顏色分量使用5位,並且您有三個顏色分量,即每像素15位。這可能會被填充到16位(正好兩個字節)以提高效率,因爲這樣可以使數據以CPU更好地處理它的方式對齊。

當您處理的視頻寬度相同時,您已達到該行的末尾。當您處理的視頻數量很多時,您的行數就已經達到了該幀的結尾。

至於這些字節的解釋,這取決於編解碼器使用的色空間。常用色彩空間爲YUV,RGBHSL/HSV

它強烈依賴於正在使用的編解碼器以及它支持的輸入格式;輸出格式通常僅限於可接受輸入格式的集合。

時間戳數據有點複雜,因爲它可以在視頻流本身或容器中進行編碼。至少,該流將需要一個幀率;由此可以通過計算已經解碼了多少幀來確定每幀的時間。其他方法,如AVI採用的方法,是在文件末尾爲每個第N幀(或僅關鍵幀)包含一個字節偏移量,以實現快速搜索。 (否則,您需要解碼每幀到您要查找的時間戳,以便確定文件中該幀的位置。)

如果您也在考慮音頻數據,請注意,對於大多數編解碼器和容器,音頻和視頻流是獨立的,彼此之間一無所知。在編碼過程中,將兩個流寫入容器格式的軟件進行一個稱爲複用的過程。它將每個數據塊以N秒爲單位寫出數據,並在數據流之間交替。這允許正在讀取流的人獲得N秒的視頻,N秒的音頻,然後是另外的N秒的視頻,等等。 (也可能包含多個音頻流 - 這種技術通常用於將視頻和英語和西班牙語音軌混合到包含三個流的單個文件中。)實際上,即使是字幕也可以與其他音頻混合流。

+0

cdhowie。非常感謝你的解釋。我有一個後續問題。根據您所描述的,視頻客戶端必須獨立繪製每個幀。考慮到連續幀之間的變化非常小,這不會是太多的CPU/GPU消耗嗎?是否讓視頻客戶端將前一幀與下一幀進行比較,確定需要重繪的像素並在屏幕上繪製該部分? – Peter

+1

@Peter看起來好像很多CPU,但事實並非如此。通常通過在視頻卡驅動程序的幫助下將幀緩衝區推送到視頻卡,在一個操作中繪製幀。還有支持硬件視頻解碼的視頻卡,因此軟件應用程序實際上會將*壓縮*視頻流發送到GPU,並將其解碼並直接顯示在顯示器上,幾乎不需要CPU參與。即使沒有這些優化,現代CPU也非常快,可以輕鬆處理這樣的任務。 – cdhowie

0

cdhowie得到了大部分。 說到時間戳,MPEG4容器包含每個幀的表格,告訴視頻客戶端何時顯示每一幀。您應該查看MPEG4的規格。您通常需要爲此付費,但絕對可以從地方下載。

http://en.wikipedia.org/wiki/MPEG-4_Part_14

+0

Adob​​e的F4V視頻文件格式是MPEG4的超集,可以從http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf – Perry

+0

James下載(免費)規格。感謝你的幫助。隨後的問題。我發現有兩種方法可以讓視頻客戶端進行處理。 1)始終查看時間表,「查找」當前時間的位置,並處理解碼器輸出。 2)只要繼續獲取下一幀,並繼續處理,但只有在發現時間表落後的時候才查找時間表。視頻客戶端使用的一般方法是什麼? – Peter