2010-07-02 88 views
5

我開發了一個Windows應用程序,該應用程序使用DirectShow從外部設備捕獲視頻。圖像分辨率爲640x480,無壓縮保存的視頻具有非常大的尺寸(每秒約27MB)。DirectShow中的實時視頻編碼

我的目標是儘可能減小這個尺寸,所以我正在尋找一個編碼器,它可以讓我實時壓縮視頻。它可能是H.264,MPEG-2或其他任何東西。它必須允許我將視頻保存到磁盤,如果我也可以通過網絡實時流式傳輸(Wi-Fi,因此它的大小應該在1MB /秒或更少),這將是最好的。重大的質量損失是不可接受的。

我發現爲此任務獲取適當的DirectShow過濾器非常困難。可以假定客戶機是合理的現代(快速2核CPU)並且可以使用CUDA/OpenCL。有幾個應用程序允許使用CUDA對視頻進行編碼並提供良好的性能,但是我沒有找到合適的DirectShow過濾器或可用於開發的API。 NVIDIA nvcuvenc.dll似乎有私人API,所以我無法直接使用它。我發現的任何基於CPU的編碼器對於我的要求來說都太慢,但也許我錯過了一些。

任何人都可以推薦我一個解決方案,即無論使用CPU/CUDA/OpenCL還是DirectCompute,都可以實現良好性能的編碼器(付費或免費,可用於閉源應用程序)?或者,也許我應該使用一些外部硬件視頻編碼器?

最好的問候,

madbadger

+0

不知道你是否找到了解決方案,但同時我開發了我的產品的傳輸流編碼 - 也許這樣的解決方案也可以接受你自從你在談論通過WiFi流式傳輸 – 2011-02-10 14:11:52

回答

3

哪些過濾你試過嗎?

如果您只處理640x480,那麼只要您選擇實際的比特率,任何合理質量的基於商業軟件的編碼器都應該沒問題。不需要使用Cuda或OpenCL進行硬件加速。 H264需要更多的馬力,並且需要更多的CPU內核,但是即使在適度的CPU上,Mpeg2或任何h263時代編解碼器(xvid,wmv9,divx等)也不應該有任何問題。在同一時間通過網絡流式傳輸需要多一點努力,但應該仍然有可能。

這不是基於DirectShow的,但是VLC Media Player可以做到這一切。它基於FFMpeg開源項目。它的某些版本是LGPL許可的,因此該庫可以併入您的項目中,沒有太多限制。

如果您只是想要一組DirectShow過濾器來處理所有這些問題,我以前使用MainConcept's產品的效果很好。儘管如此,他們仍處於昂貴的階段。

+0

謝謝,我已經註冊了對MainConcept SDK的評估。我會在後面寫出結果。 – madbadger 2010-07-07 21:53:15

+0

正如預期的那樣,MainConcept的CUDA H.264編碼器速度足夠快並且文檔齊全。 「足夠快」是指我可以在平均現代化的機器上實現實時VGA 30fps編碼,沒有明顯的質量損失,並且生成的文件比原始非壓縮文件小50-100倍。唯一的缺點是組件價格昂貴。 – madbadger 2010-08-09 00:11:57

+0

我用MainConcept的過濾器編寫了商業解決方案。我發現他們的H.264多路複用濾波器泄漏內存,他們的支持非常缺乏。他們的編碼器和解碼器濾波器雖然很棒。 – fishfood 2012-08-24 09:36:20

1

你不指定你已經嘗試了哪些過濾器,或者什麼「重要」質量損失意味着什麼,所以關於最好的我懷疑我們可以做的是建議一些編碼器試圖看看它們是否符合你的要求。

兩個很棒的是Theora和WebM視頻編碼器過濾器(您可以從xiph.org的單個安裝程序獲取它們)。他們都是高質量的編碼器,可以調整以平衡性能和質量。編碼時WebM可以使用多個處理器,這可能有助於您的情況。兩者都使用w/HTML5視頻,因此可能對您有額外的優勢。

4

既然你使用Directshow,那麼最簡單的事情就是在ASF容器中使用WMV9。這很容易,因爲它幾乎可以在所有的Windows機器上安裝(很少有安裝時間依賴性),速度非常快(在合理的現代化機器上使用它應該沒有問題),並且質量是合理的。但考慮到您的限制是8 mbit/sec(1 MB/sec),質量對您來說不是問題。 2 mbit/sec,VGA分辨率的WMV9應該看起來不錯。

它不如H264的體面實現,但從實現的角度來看,您將通過走這條路線節省大量時間。

看到這個:

http://msdn.microsoft.com/en-us/library/dd375008%28v=VS.85%29.aspx

+0

創建配置文件併爲WMV9編解碼器配置ASFWriter似乎相當棘手。還沒有找到任何好的指南,只是MicroSoft的幫助不大的文檔。 – Macke 2012-09-13 12:42:02

1

忘掉WMV編碼實時流。 WMV適用於實時低質量視頻流,但不能實時進行高質量編碼。我建議你看一下MainConcept's SDK。他們爲H.264編碼製作了一系列DirectShow過濾器。我使用MainConcept的編解碼器和DirectShow過濾器實現了H.264編碼流的實時流式傳輸和多路複用,這非常棒。

希望這有助於

1

我使用Windows Media編碼器的實時編碼,和它運作良好,即使在720×576的分辨率。其使用的一個例子是VideoPhill Recorder

它是用純.NET編寫的,用於捕獲的爲DirectShow.NET,編碼爲windowsMedia.NET

使用這兩個我能夠實現24/7穩定的實時編碼。

這兩個庫都可以在Windows上免費使用,因此您不必支付除操作系統以外的任何許可證。

1

ffdshow試用利用ffmpeg的x264東西,據說它非常快(我認爲是這樣)。此外,libjpeg-turbo可能會有所幫助,或者選擇一些其他編解碼器用於高吞吐量,如camstudio或其他。

更新:ffmpeg的可以利用現在的DirectShow輸入:http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=3&t=27

0

如果你能保持在或低於1280×1024,Micorsofts MPEG-2編碼器(包括在Vista及以上)是相當不錯的。

雖然我還沒有得到它的1080p內容工作。我懷疑這個編碼器會中止。恥辱。

+0

僅在nVidia卡上的Win x64 – Ludwo 2014-06-30 07:38:56

0

請參閱CaptureDS附帶AVBlocks的C#示例。它演示瞭如何使用AVBlocks和DirectShow構建錄像機。DirectShow用於視頻捕獲,AVBlock用於視頻編碼:

+0

您能否將鏈接代碼的核心部分發布出來? – Lizz 2015-01-27 23:43:57