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!
}
}
この場合、返されるサンプル バッファ サイズが予期されたサイズではないのはなぜですか? この問題を解決するにはどうすればよいですか?
前もって感謝します!