0

これをタイトルに入れるのは難しいので、説明させてください。

Direct3D を使用してメッシュを表示し、directshow(vmr9 + アロケータ) を使用してビデオを再生し、ビデオ フレームをテクスチャとして Direct3D 部分に送信してメッシュに適用するアプリケーションがあります。アプリケーションは 24 時間年中無休で実行する必要があります。少なくとも 24 時間ごとに再起動することは許可されていますが、それ以上の頻度で再起動することはできません。

問題は、コーデック、ビデオ ドライバ、またはビデオ ファイル自体のいずれかが原因で、数時間の再生後に directshow が問題を引き起こしているように見えることです。その時点で、アプリケーションは単にビデオの再生を拒否します。ただし、Direct3D 部分は正常に動作しており、メッシュは表示されています。アプリケーションを再起動すると、すべてが正常に戻ります。

そのため、2 つの部分を 2 つの異なるプロセスに分割することを考えています。そのため、ビデオ プロセスがビデオの再生に失敗した場合でも、少なくとも Direct3D 部分を失うことなく、すぐに再起動できました。

ポインタを渡すことでビデオ プレーヤーから direct3d プロセスにテクスチャを渡すことができるかどうか、つまり別のプロセスのテクスチャをポインタから取得することができるかどうかという実際の質問がここにあります。保護されたメモリのアドレス指定のため、私の最初の推測は不可能です。

両方のプロセスで TCP 通信をセットアップしましたが、この時点ではポインターの通信について心配する必要はありません。

これはクレイジーなアイデアかもしれませんが、これまでにないほどうまくいくでしょう

4

5 に答える 5

2

はい、Direct3D 9Ex でこれを行うことができます。これは Vista でのみ機能し、Direct3DDevice9Ex を使用する必要があります。リソースの共有については、こちらをご覧ください。

于 2009-08-29T03:36:21.470 に答える
1

問題は、コーデック、ビデオ ドライバ、またはビデオ ファイル自体のいずれかが原因で、数時間の再生後に directshow が問題を引き起こしているように見えることです。その時点で、アプリケーションは単にビデオの再生を拒否します。

代わりに、このバグを修正しないのはなぜですか?

于 2008-12-01T17:27:26.680 に答える
0

おそらく、DirectShow ホスト プロセスで Sample Grabber を使用して、システム メモリ バッファとして画像を取得できます。次に、WriteProcessMemory を使用して、Direct3D アプリで事前に合意されたアドレス (TCP などで設定) にデータを書き込むことができます。

于 2009-05-11T17:15:25.573 に答える
0

別のプロセスとして分離すると、これは不可能だと思いますが、それが子スレッドである場合、それらはメモリアドレス指定を共有していると思います。

于 2008-12-01T17:04:51.310 に答える
0

テクスチャの受け渡しが機能しません。

私は次の方法を使用してそれを行います:

  • VMR を、画像をメモリに配置するカスタム レンダラー + アロケーターに置き換えます
  • 共有メモリ プールから画像用のメモリを割り当てます
  • 別の写真を受信すると、イベントを通知します
  • Direct3D プロセスはこのイベントを待機し、メッシュを新しいテクスチャで更新します。

画像データをグラフィック カードに転送する必要があることに注意してください。大きな違いは、この転送が DirectShow アプリではなく Direct3D アプリで行われるようになったことです。

これには VMR を使用することもできます。カスタム アロケータ/レンダラー パーツで共有メモリにレンダリングできるかどうかはわかりません。

于 2008-12-01T17:31:51.007 に答える