2012-10-18 112 views
1

技術:的DirectShow:DES渲染到文件停止渲染使用

  • .NET 3.5
  • C#/ WPF
  • 的Visual Studio 2010 SP1
  • Directshow.Net
  • DES(DirectShow的編輯服務)
  • P/Invoke

=======

應用概要:

我已經開發了C#一個簡單的視頻編輯/ WPF與經過DirectShow.NET連接到DES和基於大量的自定義WPF時間軸控制DirectShow.NET附帶的DESCombine.cs示例。該應用程序的用戶可以將視頻和圖像添加到時間線,並選擇一首歌曲在後臺播放。

最終目標是將時間線內容(ds圖形內容)呈現爲基於wmv的文件。這主要通過選擇一個prx配置文件,並開始正確構建的圖來完成。

在添加到時間軸/ directshow圖形之前,所有輸入視頻都轉換爲wmv8,因此不需要特殊的第三方directshow濾鏡來連接引腳。

=======

的問題和問題:

有時但並非總是如此,Directshow的佔領期間呈現最終的視頻文件。沒有例外,CPU使用率簡單地降到0,沒有任何反應。由於我通過DirectShow.NET訪問DirectShow並且我不知道幕後發生了什麼,所以很難調試。雖然我確實啓用了非託管調試,但沒有拋出異常,我不知道什麼是錯誤的。

我可以告訴這個問題發生得更頻繁,因爲圖形越來越多的針腳。例如,渲染包含50個視頻和圖像的時間線比渲染少數圖像和視頻更可能導致這種情況。

我能做些什麼來確切地發現什麼是錯誤的,以及爲什麼發生這種情況時沒有拋出異常或錯誤指示?

=======

我曾嘗試:

設置圖表中的日誌文件(與IGraphBuilder :: SetLogFile)。

該日誌確實表明某些引腳無法連接,但是在渲染完成並失敗時,日誌看起來完全相同。

IntPtr hfile = CreateFile("c:\\dslog2.txt", GENERIC_WRITE, 0, IntPtr.Zero,  OPEN_EXISTING, 0, IntPtr.Zero); 
m_pGraph.SetLogFile(hfile); 

使用IMediaControl來暫停和運行圖形,當我檢測到它已經被分割時。這沒有做任何事情。

m_pControl.Pause(); 
Thread.Sleep(2000); 
m_pControl.Run(); 

=======

預先感謝您,任何幫助是極大的讚賞。

+0

難以分辨,但您需要找到方法來檢查圖形事件,以查看在流式傳輸過程中是否報告了任何錯誤。另一項檢查是在凍結時查看線程棧來獲取鎖的細節。最終,它最有可能是兩個EC_ERRORABORT事件之一,或者某些內存分配器上的緩衝區溢出。 –

回答

0

如果您的時間線很多,您很可能會從DES中收到「內存不足」錯誤。或者DES只是簡單的破解,因爲DES是DirectShow中一個非常棘手的部分。這聽起來像你沒有使用動態模式? Dynamic mode會自動重新連接DES-Filter並刪除未使用的源,因此內存消耗不是很大。