2011-08-28 211 views
2

我正在尋找一種方法來解碼使用c#h264(或甚至任何視頻格式)。最終目標是能夠解碼圖像,並非常嚴格地實時控制播放。我正在製作的這個項目是一個非線性視頻藝術作品,需要高清素材進行循環和編輯,播放某些幀範圍,然後無縫跳到下一個隨機選擇的幀範圍。解碼h264視頻

我已經創建了一個應用程序,它從磁盤讀取圖像文件(jpegs)並按順序在屏幕上播放它們,我可以完全控制裝入哪個幀以及何時顯示它,但是在全高清分辨率時需要稍微比我想要加載硬盤中的圖像(每個大約500k)要長,我認爲使用壓縮視頻格式會更小,因此讀取和解碼成特定幀的速度更快,但是我找不到任何現成的方法去做這個。

有沒有可以做到這一點的任何庫?即從視頻文件中提取一個任意幀,並在比顯示幀(以25fps運行)所需時間更少的時間內將其提供給我的應用程序,我已經查看了vlc庫和ffmpeg的包裝器,但我不知道哪一個會要好一些,否則會有另一種更好的選擇。我也不知道哪個編解碼器是最好的選擇,因爲有些是基於關鍵幀的,使得任意幀提取可能非常困難。

任何意見,歡迎,感謝

+1

如果您已經有一個可行的解決方案 - 爲什麼不把JPEG預加載到內存中?這應該會提供更好的性能......您還可以使用'MemoryMappedFile'使讀取速度非常快...... – Yahia

+1

如果您想完全控制,可以探索Microsoft的DirectShow API http://msdn.microsoft.com/zh-cn/ -us/library/dd390351(v = VS.85).aspx – Douglas

+0

以25fps的速度對HD H264視頻進行軟件解碼是一項相當艱鉅的挑戰! – James

回答

2

我想說,使用H.264並不是一個好主意。這樣做的原因是不同類型的幀組成流

  • I幀或關鍵幀:解碼幀所需的一切,請直接,即不依賴存在於其他幀。 P幀(預測幀):包括與先前解碼的幀的差分數據組成的幀。 B幀(雙向):由先前解碼的幀和將來幀的差分數據組成。

的幀在比特流中編碼的順序是不相同的順序幀應當被顯示。

作爲一個極端的例子,H.264內容只能有1個在剪輯開始的I幀。如果您需要顯示最後一幀,則需要對每個中間幀進行解碼,直至包括最後一幀,以便顯示它。

使用JPEG,你盯着做是不是一個壞主意。您可以利用壓縮級別來查找關於質量和解碼時間的最終文件大小。

視頻解碼器的輸出幾乎在所有情況下都是4:2:0子採樣YUV未壓縮原始數據。一個1080p幀將是1920*1080*1.5=3110400 bytes。使用這種格式,而不是JPEG(也解碼爲YUV4:2:0)將削減解碼時間從你的「應用程序」,留下只是視圖時間。 Imagemagick和一堆其他工具可以從JPEG轉換爲YUV4:2:0。這不能與評論中描述的內存映射相結合。

如果您覺得原始格式佔用很多磁盤空間,請查看huffyuv這是一種無損YUV編解碼器。

對於一位觀衆來說,我在過去使用SDL的經驗非常豐富,他了解YUV格式,使得編寫查看器變得非常簡單。幸運的是,已經有一篇文章可以用作進一步開發的模板。看看yay

0

我只想指出,文件大小並不等於總是速度。文件越小,解壓縮成本越高。你可能(並且我強調可能)通過使用未壓縮的格式,如BMP或可能的WMF,實際上獲得更好的性能。