菜瓜程序猿 2023-06-06 17:10 采纳率: 33.3%
浏览 11
已结题

C++通过DirectShow打开摄像头,但是打开的却不是我希望打开的那个摄像头!大家看看是哪里有问题?


int  CCamEXDlgDlg::PLAY(int wX, int wY,int wWidth,int wHeight)
{
    HRESULT hr,hr1;    
    // 创建IGraphBuilder接口
    hr1=CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGB);
    // 创建ICaptureGraphBuilder2接口
    hr1 = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,IID_ICaptureGraphBuilder2, (void **) &m_pCapture);
    if (FAILED(hr1))
        return 1;

    m_pCapture->SetFiltergraph(m_pGB);
    hr1 = m_pGB->QueryInterface(IID_IMediaControl, (void **)&m_pMC);
    if (FAILED(hr1))
        return 1;
    hr1 = m_pGB->QueryInterface(IID_IVideoWindow, (LPVOID *) &m_pVW);
    if (FAILED(hr1))
        return 1;
    if(!BindFilter(0, &m_pBF))
        return 1;

    hr = m_pGB->AddFilter(m_pBF, L"Capture Filter");
    // create a sample grabber
    hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
    if( !m_pGrabber )
    {
        return 1;
    }

    CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );
    //设置视频格式
    AM_MEDIA_TYPE mt; 
    ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
    mt.majortype = MEDIATYPE_Video;
    mt.subtype = MEDIASUBTYPE_RGB24;
    hr = m_pGrabber->SetMediaType(&mt);

    if( FAILED( hr ) )
    {
        return 1;
    }
    hr = m_pGB->AddFilter( pGrabBase, L"Grabber" );
    if( FAILED( hr ) )
    {
        return 1;
    }

    // try to render preview/capture pin
    hr = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
    if( FAILED( hr ) )
        hr = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);

    if( FAILED( hr ) )
    {
        //    AfxMessageBox("Can’t build the graph");
        return 1;
    }
    hr = m_pGrabber->GetConnectedMediaType( &mt );
    if ( FAILED( hr) )
    {
        return 1;
    }
    VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
    mCB.lWidth = vih->bmiHeader.biWidth;
    mCB.lHeight = vih->bmiHeader.biHeight;

    hr = m_pGrabber->SetBufferSamples( false );
    hr = m_pGrabber->SetOneShot( false );
    hr = m_pGrabber->SetCallback( &mCB, 1 );


    //设置视频捕捉窗口
    hr = m_pVW->put_Owner((OAHWND)m_hWnd);

    MoveWindow(wX,wY,wWidth, wHeight);
    if (FAILED(hr))return 1;
    hr = m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
    if (FAILED(hr))return 1;
    if (m_pVW)
    {
        m_pVW->SetWindowPosition(0, 0, wWidth,wHeight);
    } 

    hr = m_pVW->put_Visible(OATRUE);
    hr = m_pMC->Run();//开始视频捕捉

    return 0;

}
  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-06-07 13:57
    关注

    在你的代码中,可能是由于没有正确设置摄像头的 ID 或者选择了错误的摄像头导致了问题。在 DirectShow 中,可以通过设置 Capture Filter 的参数来选择摄像头。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月15日
  • 已采纳回答 6月7日
  • 创建了问题 6月6日

悬赏问题

  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题