こんにちは。山岡です。
現在私は、DirectShowのサンプル'StillCap'を
元にしてビデオカメラからの画像をとりこみ、
静止画として保存する
アプリケーションを作成しています。
当初、カメラからの画像はRGB24形式で取り込んでいましたが、
IMediaControl->Run()の実行時に
CPU使用率が100%になってしまった為、
RGB24形式からYUY2形式で取り込むよう変更しました。
以下のような感じです。
----------------------------------------
//メディアタイプ設定
CMediaType VideoType;
VideoType.SetType( &MEDIATYPE_Video );
VideoType.SetSubtype( &MEDIASUBTYPE_RGB24);<--この部分をYUY2に変更しました
hr = pISampleGrabber->SetMediaType( &VideoType );
-----------------------------------------
しかし、YUY2にすると静止画を格納する為のバッファを準備する部分で
問題が発生してしまいます。
-----------------------------------------
AM_MEDIA_TYPE mt;
hr = m_pGrabber->GetConnectedMediaType(&mt);
if (szCapBitmap != NULL)
{
DeleteObject(szCapBitmap);
}
VIDEOINFOHEADER *pVideoHeader;
pVideoHeader = (VIDEOINFOHEADER*)mt.pbFormat;
ZeroMemory(&szBmInfo, sizeof(szBmInfo));
CopyMemory(&szBmInfo.bmiHeader, &(pVideoHeader->bmiHeader), sizeof(BITMAPINFOHEADER));
szCapBitmap = CreateDIBSection(0, &szBmInfo, DIB_RGB_COLORS, &m_pBmpBuffer, NULL, 0);
-----------------------------------------------------------
こんな感じでバッファの準備をし、CreateDIBSectionにより
生成されたビットマップのハンドルを得ようとしているのですが、
NULLが帰ってきてしまいます。
直後にGetLastError()を実行しても、「正常に終了しました」といった
コードしか得られないため、なにがいけないのかが良くわからないのです。
MEDIASUBTYPE_RGB24からMEDIASUBTYPE_YUY2に変更したのが大元の原因
であるとは思うのですが。
どなたか、CMediaType.SetSubtypeにMEDIASUBTYPE_YUY2をセットした場合の
ビットマップのハンドルの取得の仕方をご存知でしょうか。
ご存知でしたら何卒ご教授いただきたく思います。
現在、VFW or DirectShow で WevCamライブ画像配信を作っている者です。
私の場合、MEDIASUBTYPE_YUY2
で取得したバッファを、
CreateDIBSectionで直接渡すことはできませんでした。
どうやら、
BITMAPINFOHEADER.biCompression == 844715353 /*YUV422*/
の場合、YUV422はアンチサポートのため、
バッファサイズの問題から(圧縮率:16/24なので)跳ね返されます。
そのため、YUY2(YUV422)からDDV24に変換してから、
具体的には、844715353 から BI_RGB へ変換後、
CreateDIBSectionに渡してください。
ツイート | ![]() |