1

AMcap は、ビデオをキャプチャしたり、Web カメラからプレビューするためのアプリです。そのソース コードには、サンプルとして Microsoft Windows SDK が付属しています。

私は(amcapコードでのユーザーインタラクションの次のプロセスをバイパスするか、したいと言います)それをデフォルトとして設定したいです:

アンプキャップメニュー

  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。

4

2 に答える 2

1

ちょっと@Danivander 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);
}

どうもありがとう

于 2009-05-22T14:04:43.873 に答える
1

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);

繰り返しますが、これはテストされていないコードですが、試してみてください。お役に立てば幸いです。

于 2009-05-22T12:14:23.220 に答える