AMCAPのデフォルトの色空間をYuy2に設定する方法は?
-
23-08-2019 - |
質問
AMCAPは、ビデオをキャプチャしたり、ウェブカメラからプレビューするためのアプリです。そのソースコードには、Microsoft Windows SDKがサンプルとして付属しています。
私は(AMCAPコードでのユーザーインタラクションの次のプロセスをバイパスするか、それをデフォルトとして設定したいと考えています。
ampcapメニュー
Options
Video Capture Pin ...
Color Space/Compression: YUY2
Output size: 1600x1200
互換性のあるウェブカメラがあり、AMCAPアプリのYUY2と1600x1200に手動で変更するのに適しています。
デフォルトでは:
Color Space/Compression: MJPG
Output size: 160x120
プロジェクト全体で「Yuy2」文字列を見つけようとしましたが、それを見つけることができなかったので、ハードコードできました。動的に作成されてから操作されるようです。参照:ファイルamcap.cpp近くのライン番号3395。
解決 2
ちょっと@dani van der meer:ポインターをありがとう...私はそれをやった:関数bool initcapfilters()
後
if(hr != NOERROR)
{
hr = gcap.pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video, gcap.pVCap,
IID_IAMStreamConfig, (void **)&gcap.pVSC);
if(hr != NOERROR)
{
// this means we can't set frame rate (non-DV only)
ErrMsg(TEXT("Error %x: Cannot find VCapture:IAMStreamConfig"), hr);
}
}
gcap.fCapAudioIsRelevant = TRUE;
ペースト:
CMediaType *pmt;
// default capture format
if(gcap.pVSC && gcap.pVSC->GetFormat((AM_MEDIA_TYPE**)&pmt) == S_OK)
{
// DV capture does not use a VIDEOINFOHEADER
if(pmt->formattype == FORMAT_VideoInfo)
{
pmt->SetType(&MEDIATYPE_Video);
pmt->SetFormatType(&FORMAT_VideoInfo);
pmt->SetSubtype(&MEDIASUBTYPE_YUY2);
pmt->SetTemporalCompression(FALSE);
VIDEOINFOHEADER* lpvihin = (VIDEOINFOHEADER*) pmt->pbFormat;
{
//DWORD fccYUY2 = 'YUY2' ;
//lpvihin->bmiHeader.biCompression =fccYUY2;
//'YUY2';// MAKEFOURCC('Y','U','Y','2');
//lpvihin->bmiHeader.biBitCount = 16;
lpvihin->bmiHeader.biWidth = 1600;// 960; //1600;
lpvihin->bmiHeader.biHeight = 1200;// 720; //1200;
lpvihin->bmiHeader.biSizeImage = 1600*1200*3;
hr = gcap.pVSC->SetFormat(pmt);
ResizeWindow(HEADER(pmt->pbFormat)->biWidth,
ABS(HEADER(pmt->pbFormat)->biHeight));
}
}
if(pmt->majortype != MEDIATYPE_Video)
{
// This capture filter captures something other that pure video.
// Maybe it's DV or something? Anyway, chances are we shouldn't
// allow capturing audio separately, since our video capture
// filter may have audio combined in it already!
gcap.fCapAudioIsRelevant = FALSE;
gcap.fCapAudio = FALSE;
}
DeleteMediaType(pmt);
}
どうもありがとう
他のヒント
IID_IAMSTREAMCONFIGインターフェイスを使用してカメラの画像サイズを設定するコードがいくつかあります。画像形式を設定するために使用しませんでしたが、仕事をすると思われるコードを追加しました。しかし、それはテストされていません。
// get the number of formats and make sure the strutucre size matches
int count;
int size;
VIDEO_STREAM_CONFIG_CAPS caps;
pSC->GetNumberOfCapabilities(&count, &size);
if( sizeof(caps) != size )
{
// Error
}
AM_MEDIA_TYPE* mt_p = NULL;
hr = pSC->GetStreamCaps(0, &mt_p, (BYTE*)&caps);
if (hr != S_OK)
{
// Error
}
if ((mt_p->majortype != MEDIATYPE_Video) || (mt_p->formattype != FORMAT_VideoInfo))
{
// Error
}
VIDEOINFOHEADER* video_info_header_p = (VIDEOINFOHEADER *)mt_p->pbFormat;
video_info_header_p->bmiHeader.biWidth = 1600;
video_info_header_p->bmiHeader.biHeight = 1200;
// Code to change video format
// I think 16 is the right value for biBitCount, but I am not sure!!!!
video_info_header_p->bmiHeader.biCompression = MAKEFOURCC('Y','U','Y','2');
video_info_header_p->bmiHeader.biBitCount = 16;
hr = pSC->SetFormat(mt_p);
if (hr != S_OK)
{
// Error
}
if (mt_p->cbFormat != 0)
{
CoTaskMemFree((PVOID)mt_p->pbFormat);
mt_p->cbFormat = 0;
mt_p->pbFormat = NULL;
}
if (mt_p->pUnk != NULL)
{
// Unecessary because pUnk should not be used, but safest.
mt_p->pUnk->Release();
mt_p->pUnk = NULL;
}
次のブロックの後にAMCAPにコードを配置する必要があります。
if(hr != NOERROR)
hr = gcap.pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video, gcap.pVCap,
IID_IAMStreamConfig, (void **)&pSC);
繰り返しますが、これはテストされていないコードですが、試してみることができ、それが役立つことを願っています。
所属していません StackOverflow