2013-07-20 27 views
0

以下是我的篩選圖。我正嘗試在濾鏡圖片中插入「ffdshow視頻編碼器」編碼器,但我無法這樣做。 enter image description here視頻壓縮不適用於實時捕捉

以下是我的努力得到FilterGraph動態生成後,連接壓縮機代碼:

public void setFileName(string pFileName) 
    { 
     int hr; 
     IBaseFilter _infinitePinTeeFilter = null; 
     graph.FindFilterByName("Infinite Pin Tee Filter", out _infinitePinTeeFilter); 

     mediaControl.Stop(); 
     hr = captureGraphBuilder.SetOutputFileName(MediaSubType.Avi, pFileName, out mux, out sink); 
     checkHR(hr, "Can't set SetOutputFile"); 
     hr = captureGraphBuilder.RenderStream(null, MediaType.Video, _infinitePinTeeFilter, _videoCompressor, mux); 
     checkHR(hr, "Can't Render Output File"); 
     mediaControl.Run(); 
    } 

任何幫助,將不勝感激...謝謝。

回答

0

ICaptureGraphBuilder::SetOutputFileName不是用於設置圖表的API的好選擇。它對於簡單的圖表來說工作得很好,但是因爲它會將錯誤轉發給沒有良好描述的錯誤以及錯誤實際發生的階段,所以每次你都很難明白出了什麼問題。

這個問題可能是由於視頻壓縮器輸出上沒有媒體類型的幀速率信息造成的,但作爲您的屏幕截圖中的構建階段,您甚至沒有可用的媒體類型,也不能排除故障並獲取這些信息。

改爲使用IGraphBuilder::AddFilter,IGraphBuilder::Connect,IFileSinkiFilter::SetFileName來可靠地配置流水線。

+0

非常感謝..如果給出一些代碼參考,那將會很棒。此外,是否有可能在同一個圖表中有視頻流,samplegrab和文件保存(壓縮)? – Ravi

+0

您正在構建的拓撲可以完成並且可以工作(特別是在捕獲+預覽+抓取+錄製的同時)。 AVI Mux對媒體類型可能有自己的要求,視頻壓縮機也有自己的要求。當您執行批量操作'SetOutputFileName' /'RenderStream'來完成圖形時,您看不到它失敗的位置。如果你逐漸增加一些東西,你可以看到這一點。 –

+0

謝謝!你總是幫助! – Ravi