問題タブ [directshow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
1108 参照

c++ - DirectShow の eof 検出

DirectShow フィルターグラフがファイルの終わりに達したことを検出する方法はありますか? そのファイルの終わりまでに、SampleGrabber フィルターを使用するフィルターグラフは別の SampleCB 呼び出しを受信しないことを意味します。

機能しないものを次に示します。

  • 信頼IMediaDet::get_StreamLength(ビデオには実際よりも多くのフレームがあるとよく言われます)
  • Trust IMediaSeeking::GetDuration(IMediaDet と一致、+/- 1 フレーム)
  • 使用IMediaControl::GetState(すべてのフレームがファイルから既に処理されている場合でも、フィルターグラフは実行されたままになります)

バックグラウンド:

私はビデオ処理を行っており、SampleGrabber でフィルターグラフを作成するクラスを持っています。が呼び出されるたびSampleGrabber::SampleCBに、mutex でブロックして、filtergraph をプル モードで実行できるようにします。別のフレームの準備ができたら、メイン スレッドでミューテックスのブロックを解除し、完了しSampleGrabber::SampleCBたというシグナルが送信されるのを待ちます。一部のビデオでIMediaDet::get_StreamLengthは、ビデオに実際に存在するよりも多くのフレームがあることがわかります。最終フレームを抽出し、実際に存在するフレームよりも 1 つ多く要求すると、メイン スレッドSampleGrabber::SampleCBは二度と呼び出されないため、永久にブロックされます。いつ検出できるようにしたいのですか?SampleGrabber::SampleCBファイルソースに対して呼び出されることはありません。Windows Media Player などのアプリケーションは、ビデオが最後の実際のフレームの後に終了したことを GUI が報告するため、何らかの方法でこれを行うことができます。これを行う方法があるようです。

編集:

WaitForSingleObjectメインスレッドのブロックを実装するために使用しています。私がこれまでに使用してきた回避策は、Greg が提案したことを実行することです: 有限のタイムアウトを設定します。残念ながら、これは少しトリッキーになります。待機は、真の eof、低速のネットワーク ファイルシステム、ネットワーク接続の切断、低速のデコーダなど、さまざまな理由で失敗する可能性があります。

0 投票する
5 に答える
1968 参照

c# - プロセス全体でポインタを使用してテクスチャを渡す

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

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

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

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

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

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

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

0 投票する
1 に答える
2378 参照

c++ - Windows Mobile の DirectShow、ビデオ ズーム、画像キャプチャ

現在、ライブ ビデオ ストリーミング用のアプリケーション (www.livecliq.net) を開発しており、画像キャプチャとビデオ ズームの機能を追加したいと考えています。DirectShow に関するチュートリアルとリソースを探し回っていますが、これまでのところ、高度なビデオ操作にはあまり役に立たない本「Programming Microsoft DirectShow for Digital Video and Television」しか見つかりませんでした。

可能かどうか、キャプチャしたビデオにデジタルズームを適用する方法、およびデバイスのカメラで写真をキャプチャする方法を知っている人はいますか?

ありがとう!

0 投票する
1 に答える
1773 参照

c++ - DirectShowを使用した字幕ファイルとMPEGビデオのフレームの正確な同期

これは私がしばらく扱ってきた問題であり、(Microsoftからでも)良い答えを得ることができませんでした。汎用ダンプフィルターを使用して、ハードウェアで圧縮されたMPEGファイルをディスクに書き込みます。グラフには、すべてのフレームで呼び出されるSampleGrabberフィルターもあります。SampleGrabberコールバックから、DirectShowタイムスタンプとともに字幕を取得し、SAMI(.smi)字幕ファイルに書き込みます。SAMIファイルにはすべてのフレームに正しい字幕が含まれているため、これはすべて機能しているようです。ただし、いくつか問題があります。

  1. 最初のいくつか(通常は3または4)のDirectShowタイムスタンプはすべて0です。SampleGrabberからコールバックを取得している場合、これらのタイムスタンプは増分されるべきではありませんか?

  2. 再生を開始すると、最初に表示されるタイムスタンプは、SAMIファイルの約10〜20個の字幕です。最初のフレームには、ファイルの最初のタイムスタンプが表示されると思います。

  3. これはおそらく#2に関連していますが、字幕がファイル内の適切なフレームに同期されていません。最大40フレーム遅れることがあります。

私はC++経由でDirectShowを使用しており、Windows XP SP3(最新のドライバーは2008年9月8日)でHauppauge HVR-1800を使用してキャプチャし、Media PlayerClassic6.4.9.0で再生しています。どんなアイデアでも大歓迎です。

0 投票する
3 に答える
11734 参照

c# - DirectShow でキャプチャされたストリームをマルチキャストする方法は?

非常に単純なストリーミング サーバーを構築する必要があります。デバイスからビデオをキャプチャし、そのビデオをマルチキャスト経由で LAN 上の複数のクライアントにストリーミングできる必要があります。

これのキャプチャ部分は、誰かが DirectShow.Net ( http://www.codeproject.com/KB/directx/directxcapture.aspx )で作成したライブラリのおかげで (C# で) 非常に簡単です。

私が今持っている質問は、これをマルチキャストする方法ですか? これは私が立ち往生している部分です。次に何をすべきか、またはどのような手順を踏めばよいかわかりません。

0 投票する
1 に答える
1796 参照

c++ - IAMCameraControl::Set() を使用して Windows Mobile デバイスでズームを設定する

ビデオ キャプチャ用のアプリケーションを開発しており、ズーム機能を実装したいと考えています。

DirectShow での作業 IAMCameraControlInterface に出会いました。メソッド ::Set() があり、いくつかのカメラ パラメータを設定するために使用する必要があります。

しかし、私は遊んでいて、それで何もできませんでした。次に、可能なパラメータ値の範囲を返す ::GetRange() メソッドを呼び出そうとしましたが、何も返されませんでした。

デバイスがオプションをサポートしていない可能性は本当にありますか? ネイティブのカメラ アプリケーションがズームをサポートしているため、非常に奇妙に思えますが、このような奇妙な結果の主な問題がどこにあるのか、私にはよくわかりません。

同様のアプリケーションを使用した経験のある人はいますか? ここで何が問題なのか、またはIAMCameraControlInterface関数を効果的に使用する方法を知っている人はいますか?

0 投票する
3 に答える
2763 参照

.net - .NETアプリケーションでの予測可能なフレームキャプチャのオプション

私はC#で作業しており、ビデオファイルの個々のフレームをキャプチャする必要があります。できるだけ早く(リアルタイムよりも速く)、特定のフレーム番号を探し、n番目ごとのフレームをBMPやJPEGなどのグラフィックファイル形式にキャプチャしたいと思います。キャプチャされるフレームが予測可能で再現可能である、つまりフレームをドロップしないことが強く望まれます。

DirectShowの使用経験はありますが、このテクノロジが最新のWindows.NET環境でこの問題に使用するのに最適かどうかはわかりません。理想的には、可能な限り抽象化するための.NETまたはCOMベースのライブラリを見つけたいと思います。ビデオファイルを実際に画面に表示する必要はありません。実際、ビデオ再生用のWindowsユーザーインターフェイスは必要ありません。

誰かが調査する技術や特定の製品についての提案がありますか?それらは、DivXを含むMPEG-2およびMPEG-4ベースのビデオファイルと互換性がある必要があります。QuickTimeのサポートは素晴らしいボーナスです。

0 投票する
1 に答える
4123 参照

c++ - DirectShow - ビデオにテキストを重ねる方法

画面のビデオ プレビューの上にテキストを表示する Windows Mobile 用のアプリケーションを作成しています。

これを行う方法を知っている人はいますか、それについての良いチュートリアルはありますか?

ありがとう!

0 投票する
1 に答える
3885 参照

c# - C#を使用してManagedDirectXでビデオ上にテキストを描画する

C#を使用してManaged DirectXでビデオ上にテキストを描画するにはどうすればよいですか?

0 投票する
1 に答える
2272 参照

c# - DirectShow: グラフはコードではなく GraphEdit で機能する

GraphEdit で次のグラフを作成しました: Logitech Webcam -> Infinite Tee Pin Filter -> VideoRenderer。これは問題なく動作します (GraphEdit は、TEe フィルターと VideoRenderer フィルターの間にいくつかの中間フィルターを自動的に挿入します)。

コードで同じことを試みましたが、Tee フィルターを VideoRenderer に接続しようとすると失敗します。最初に Web カメラを T フィルターに接続すると動作します (Web カメラがオンになり、S_OK が表示されます)。次に、T フィルターから 1 つの出力ピンを最初のフィルターに接続しようとしましたが、失敗しました (エラーは、それが可能であるということです)。それらを接続するための一連の中間フィルターが見つかりません)。同じ効果で、IGraphBuilder::Connect と ICaptureGraphBuilder2::RenderStream の両方にそれらを接続しようとしました。ピンを列挙するには、hr = _CaptureGraphBuilder.FindPin(theFilter, PinDirection.Input, null, null, true, 0, out thePin); を使用します。ビデオ レンダラーの場合、Tee フィルターの PinDirection.Output を除いて同じです (これは C# にありますが、コンストラクトは C++ に正確にマップされます)。

何か案は?