私は以前はあまり変わっていない問題に遭遇しましたが、WPFではそうではありませんでしたので、以下の(非常にハッキーな)提案を塩のピンチで取ります。
以下のメソッドは、基本的にdirectshowコマンドを実行する完全に別個のアプリケーションスレッドを作成しますが、WPFアプリケーションでホストされているWindowsフォームコントロールのハンドルを使用するようにダイレクトショーに指示します。
だから、最初に私たちは、ダミーのWinFormsは、我々は上のコールを呼び出すために使用できることを形成する必要があるが、それは決して、レンダリングを取得するつもりはありません:
/// <summary>
/// Just a dummy invisible form.
/// </summary>
private class DummyForm : Form
{
protected override void SetVisibleCore(bool value)
{
//just override here, make sure that the form will never become visible
if (!IsHandleCreated)
{
CreateHandle();
}
value = false;
base.SetVisibleCore(value);
}
}
次のステップは、我々は置くことができますスレッドを作成することですメッセージループ上:ダミーフォーム(およびそのスレッド)が作成された後
//this will need to be a class level variable, since all the directshow
//calls will get invoked on this form
DummyForm dumbForm;
Thread separateThread;
private void CreateDummyForm()
{
ManualResetEvent reset = new ManualResetEvent(false);
//create our thread
separateThread = new Thread((ThreadStart)
delegate
{
//we need a dummy form to invoke on
dumbForm = new DummyForm();
//signal the calling method that it can continue
reset.Set();
//now kick off the message loop
Application.Run(dumbForm);
});
//set the apartment state of this new thread to MTA
separateThread.SetApartmentState(ApartmentState.MTA);
separateThread.IsBackground = true;
separateThread.Start();
//we need to wait for the windowing thread to have initialised before we can
//say that initialisation is finished
reset.WaitOne();
//wait for the form handle to be created, since this won't happen until the form
//loads inside Application.Run
while (!dumbForm.IsHandleCreated)
{
Thread.Sleep(0);
}
}
そう、あなたがそうのようなMTA アプリケーションスレッド上で呼び出しを呼び出すことができます。
あなたはすべてのDirectShowもので終わっその後
、そのようなシャットダウンあなたの個別のアプリケーションのスレッド:このアプローチの
//to end the separate thread and application loop,
//just close your invisible form
dumbForm.Close();
利点は、あなたがきちんと別のスレッドにDirectShowのサンドボックスということです。欠点は、Invoke呼び出しのコンテキスト切り替えと、別のアプリケーションスレッドを持つオーバーヘッドです。あなたはこれをあなたの現在のアーキテクチャに組み込むことが楽しいかもしれませんが、助けてください。
あなたはどのように乗っているか教えてください。私はこの作品がどれほどうまくいっているかに興味を持っています。
ポストコードを記入するかポストしますか?私は最初に行くだろう。 –
なぜDirectShowを使用していますか? WPFはメディアを再生できます。 –
@エモ - おそらく彼はファイルや通常のビデオストリームではないビデオソースを持っていますか?彼はある種のカスタムソースフィルタを持っているかもしれませんが、私はこれまでに遭遇しました。 – Kazar