1

使用した技術:

  • .NET 3.5
  • C#/WPF
  • ビジュアル スタジオ 2010 SP1
  • Directshow.Net
  • DES (DirectShow 編集サービス)
  • P/呼び出す

=======

アプリケーションの概要:

DirectShow.NET を介して DES に接続され、DirectShow.NET に含まれる DESCombine.cs サンプルに大きく基づいているカスタム WPF タイムライン コントロールを使用して、C#/WPF で単純なビデオ エディターを開発しました。アプリケーションのユーザーは、動画や画像をタイムラインに追加したり、バックグラウンドで再生する曲を選択したりできます。

最終的な目標は、タイムラインの内容 (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();

=======

事前に感謝します。どんな助けでも大歓迎です。

4

1 に答える 1

0

多くのソースを含むタイムラインがある場合、DES から「メモリ不足」エラーが発生する可能性が高くなります。または、DES は DirectShow の非常にバグのある部分であるため、単純に破壊されます。ダイナミック モードを使用していないようですね。動的モードでは、DES-Filter が自動的に再接続され、未使用のソースが削除されるため、メモリ消費はそれほど大きくありません。

于 2012-11-15T20:59:18.060 に答える