0

Media Foundation を使用して、Windows 用のオーディオ/ビデオ キャプチャ ライブラリに取り組んでいました。ただし、 Windows 8.1 の一部の Web カメラについて、この投稿で説明されている問題に直面しました。したがって、ドライバーがまだ更新されていない Web カメラをアプリでサポートするために、Directshow を使用して別の実装を行うことにしました。

ライブラリは非常にうまく機能しますが、返されたサンプル (IMediaSample) が、カメラを起動する前に設定されたフォーマットに従って期待されるサイズを持たない、一部の Web カメラの問題に気付きました。

たとえば、フォーマット セットのサブタイプが MEDIASUBTYPE_RGB24 (ピクセルあたり 3 バイト) で、フレーム サイズが 640x480 の場合があります。フォーマットを適用すると、biSizeImage (BITMAPINFOHEADER から) は 640*480*3 = 921600 になります。IAMStreamConfig::SetFormat() メソッドは、フォーマットの適用に成功します。

hr = pStreamConfig->SetFormat(pmt);

また、次のように Sample Grabber Interface にフォーマットを設定します。

hr = pSampleGrabberInterface->SetMediaType(pmt);

グラフを開始する前にフォーマットを適用しました。

ただし、コールバック (ISampleGrabberCB::SampleCB) で、サイズ 230400 のサンプルを受信して​​います (サイズ 320x240 (320*240*3=230400) のフレームのバッファーである可能性があります)。

HRESULT MyClass::SampleCB(double sampleTime, IMediaSample *pSample)
{
   unsigned char* pBuffer= 0;
   HRESULT hr = pSample->GetPointer((unsigned char**) &pBuffer);
   if(SUCCEEDED(hr) {
      long bufSize = pSample->GetSize();
      //bufSize = 230400
   }
}

IMediaSample::GetMediaType() メソッドを使用して返されたメディア タイプを調査しようとしましたが、メディア タイプは NULL です。つまり、メディア タイプが変更されていないGetMediaType メソッドのドキュメントによると(つまり、まだIAMStreamConfig::SetFormat() 関数を使用して正常に適用したメディア タイプ)。

HRESULT hr = pSample->GetMediaType(&pType);

if(SUCCEEDED(hr)) {
   if(pType==NULL) {
     //it enters here => the media type has not changed!
   } 
}

この場合、返されるサンプル バッファ サイズが予期されたサイズではないのはなぜですか? この問題を解決するにはどうすればよいですか?

前もって感謝します!

4

1 に答える 1

1

サンプル グラバー コールバックは、ストリーミング パイプラインで使用される実際のデータ サイズと形式に一致するという点で、常に「正しい」サイズを返します。

不一致が見られる場合は、フィルター グラフのトポロジーが期待したものと異なることを意味します。グラフを確認し (特に、 GraphEdit によるリモート接続を使用)、メディアの種類を調べ、グラフが正しく作成されなかった理由を確認する必要があります。たとえば、ピンを接続した後で目的のフォーマットを適用している可能性がありますが、これでは遅すぎます。

以下も参照してください。

于 2015-04-03T13:24:04.713 に答える