問題タブ [samplegrabber]
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.
c++ - ISampleGrabber::GetCurrentBuffer() は E_OUTOFMEMORY を返します
DirectShow を初めて使用し、DirectShow サンプル "FrameGrabberDemo" を使用しており、画像を取得する際に問題に直面しています。.avi と .mpg で試しましたが、どちらも同じ問題を引き起こしています。
最初の問題は、IMediaControl::Run() からの S_FALSE 戻り値である可能性があります。ただし、これはエラーではなく、次のように述べています。
グラフは実行の準備をしていますが、一部のフィルターが実行状態への移行を完了していません。
2 番目の観測は、ISampleGrabber::GetCurrentBuffer() が E_OUTOFMEMORY コードを返すことです。ただし、BitmapInfo には biImageSize = 1244160 があり、MediaType にも ISampleSize = 1244160 があります。
::CreateDIBSection も NULL を返さず、バッファも初期化されます。
これはどのように解決できますか?
c++ - Sample Grabber によって返された IMediaSample に予期しないバッファ サイズがあります
Media Foundation を使用して、Windows 用のオーディオ/ビデオ キャプチャ ライブラリに取り組んでいました。ただし、 Windows 8.1 の一部の Web カメラについて、この投稿で説明されている問題に直面しました。したがって、ドライバーがまだ更新されていない Web カメラをアプリでサポートするために、Directshow を使用して別の実装を行うことにしました。
ライブラリは非常にうまく機能しますが、返されたサンプル (IMediaSample) が、カメラを起動する前に設定されたフォーマットに従って期待されるサイズを持たない、一部の Web カメラの問題に気付きました。
たとえば、フォーマット セットのサブタイプが MEDIASUBTYPE_RGB24 (ピクセルあたり 3 バイト) で、フレーム サイズが 640x480 の場合があります。フォーマットを適用すると、biSizeImage (BITMAPINFOHEADER から) は 640*480*3 = 921600 になります。IAMStreamConfig::SetFormat() メソッドは、フォーマットの適用に成功します。
また、次のように Sample Grabber Interface にフォーマットを設定します。
グラフを開始する前にフォーマットを適用しました。
ただし、コールバック (ISampleGrabberCB::SampleCB) で、サイズ 230400 のサンプルを受信しています (サイズ 320x240 (320*240*3=230400) のフレームのバッファーである可能性があります)。
IMediaSample::GetMediaType() メソッドを使用して返されたメディア タイプを調査しようとしましたが、メディア タイプは NULL です。つまり、メディア タイプが変更されていないGetMediaType メソッドのドキュメントによると(つまり、まだIAMStreamConfig::SetFormat() 関数を使用して正常に適用したメディア タイプ)。
この場合、返されるサンプル バッファ サイズが予期されたサイズではないのはなぜですか? この問題を解決するにはどうすればよいですか?
前もって感謝します!
c++ - CaptureGraphBuilder2 での SampleGrabber の使用に関する問題
SampleGrabber を使用して Web カメラからフレームを取得し、ビットマップとして保存しようとしましたが、うまくいきませんでした。ICaptureGraphBuilder2 を使用した MSDN の Directshow ビデオ キャプチャの例と、サンプル グラバーの例も使用しました。
フィルタ グラフは次のようになるはずです。
Webcam (ソース) -> Sample Grabber -> Null Renderer
プレビューを見ることに興味がないので、null レンダラーで十分だと判断しました。
計画では、特定の VID と PID (webcamCapture::findWebCam()) を検索してウェブカメラを見つけ、サンプルグラバーを作成し、null レンダラーを作成してから、pGraphBuilder->RenderStream() を使用してそれらをすべて接続することでした。必要なフレームは 1 つだけなので、OneShot メソッドを使用してから、GetCurrentBuffer を使用してフレームを取得しました。
問題は次の行で発生します。
返された HRESULT コードは E_ABORT でした。タイムアウトを INFINITE に設定すると、プログラムがフリーズする原因となり、おそらくフィルターが停止しないことを意味します。pControl->Run() からの HRESULT は S_FALSE でした。これは、すべてのフィルターが実行されているわけではないことを意味します。なぜそうなのかはわかりませんが、これらのフィルターを作成するときに何か問題が発生したように感じます。
以下は私のソースのダンプです。Web カメラのキャプチャを処理するクラスを作成しました。使用中は、基本的に次の 2 つのものが呼び出されます。
runFilter はフィルターを実行し、フレームをビットマップ ファイルとして保存します。私はdirectshowが初めてで、単純なものが欠けていると確信しています。どんな洞察も大歓迎です!
ソース
c# - C# でのビデオのキャプチャが非常に遅い
ビデオをテキストと画像でオーバーレイできるビデオプレーヤーを作成しようとしています。今、私はビデオをキャプチャし、自分のソフトウェアに表示するために drikshow サンプル グラバー フィルターを使用しています。正常に動作しますが、Atom のようなそれほど強力でないシステムでは非常に遅くなります。他の人が提案したように、EVR Presenter も使用しようとしました。マネージ DirectX 9 グラフィックスとゲーム プログラミングでコード プロジェクト ( Direct3D ビデオ レンダリングを使用した純粋な C# の EVR プレゼンター) のコード例から EVR プレゼンターを使用し、キック スタートでフレームをテクスチャに変換し、変換されたテクスチャを画面に表示します。サンプル コードは次のとおりです。
しかし、それでもレンダリング速度は非常に遅く、多くの CPU パワーを必要とします。ビデオをキャプチャしたり、ビデオ フレームをテクスチャにコピーしたりする方法があれば教えてください。
c++ - vc++ でサンプルグラバーを使用するにはどうすればよいですか? サンプルグラバーが定義されていません
Visual Community 2015 には、c++ プロジェクトがあります。私が持っているcppファイルの上部に
プロジェクトのプロパティを入力するときにも設定します > VC++ ディレクトリ このディレクトリをインクルードに追加しました: C:\Program Files %28x86%29\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses
問題は、コードに次のように入力するときです。
CLSID_SampleGrabber が定義されていません。
これまでに試したことは何ですか?directx SDK 9 および 6 と Microsoft SDK 7.1 をダウンロードし、Google で qedit.h を検索しましたが、ファイルが見つかりませんでした。CLSID_SampleGrabber の定義方法がわかりません