使用Accord.Video.DirectShow获取相机分辨率

时间:2017-10-16 15:06:24

标签: c# .net directshow accord.net

我正在评估Accord.NET Framework(https://github.com/accord-net/framework/)以用于成像应用程序。目前我有一些基本要求 - 从USB摄像头捕获视频以在UI上显示并查看/更改所有摄像头属性。

Accord.Video.DirectShow.VideoCaptureDevice.DisplayPropertyPage适用于显示相机属性,例如亮度,对比度,色调等,但不显示可用的相机分辨率。

Accord.Video.DirectShow.VideoCaptureDevice.VideoCapabilities只返回一个分辨率,但我还想要几个分辨率。

我已经尝试了VideoCapx(http://videocapx.com/)ActiveX控件并使用其ShowVideoFormatDlg方法,我可以显示一个对话框,显示所有可用的分辨率,帧率等等。我理解这是制造商提供的对话框,通过OLE访问\ COM。我正在寻找的是一种通过.NET访问它的方法,希望通过Accord框架。

我理解其他分辨率可能是转换过滤器的属性,但我是.NET中的DirectShow和COM接口的新手,所以我正在寻找一些指示。

1 个答案:

答案 0 :(得分:2)

我用来包装.NET的DirectShow代码。 使用DirectShow肯定可以获取,设置和检索/ v源功能。 您是否尝试使用IAMStreamConfig视频接口在某些捕获和压缩过滤器上设置输出格式?

我使用此代码获取分辨率并将其设置在不同的源上。 其中m_pVCap:源过滤器

hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,
               m_pVCap, IID_IAMVideoCompression,(void **)&m_pVC);

    if (hr != S_OK)
        hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
               m_pVCap,IID_IAMVideoCompression,(void **)&m_pVC);

    // !!! What if this interface isn't supported?
    // we use this interface to set the frame rate and get the capture size
    hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,
               m_pVCap, IID_IAMStreamConfig, (void **)&m_pVSC);
    if (hr != NOERROR) 
    {
        hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, 
          m_pVCap, IID_IAMStreamConfig,(void **)&m_pVSC);
        if (hr != NOERROR) 
        {
            LogDXError(hr, false, FILELINE);
        }
     }

获取当前的源格式

hr = m_pVSC->GetFormat(&pmt);
    // DV capture does not use a VIDEOINFOHEADER
    if (hr == NOERROR) 
    {
        if (pmt->formattype == FORMAT_VideoInfo) 
        {   
            VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *)pmt->pbFormat;

            pvi->AvgTimePerFrame = (LONGLONG)(10000000 / m_FrameRate);

            hr = m_pVSC->SetFormat(pmt);

            if (hr != NOERROR)
                (NotifyNewError) (FILELINE, "", LOG_ALL, ERR_GRAVE, false,
                    "Cannot set frame rate for capture");

            hr = m_pVSC->GetFormat(&pmt);
            pvi = (VIDEOINFOHEADER *)pmt->pbFormat;

            pvi->bmiHeader.biWidth = g_SizeOutput.cx;
            pvi->bmiHeader.biHeight = g_SizeOutput.cy;
            pvi->bmiHeader.biSizeImage = DIBSIZE(pvi->bmiHeader);

            hr = m_pVSC->SetFormat(pmt);
            if (hr != NOERROR)
            {
                char ErrTxt[MAX_ERROR_TEXT_LEN];                           
                AMGetErrorText(hr, ErrTxt,MAX_ERROR_TEXT_LEN);
                wsprintf(szError, "Error %x: %s\nCannot set frame rate (%d)for 
                   prev", hr, ErrTxt,m_FrameRate);
                (NotifyNewError)(FILELINE, "", LOG_ALL, ERR_GRAVE, false, szError);                 
             }

             DeleteMediaType(pmt);
        }

要获得可以使用的源功能:

IAMStreamConfig::GetNumberOfCapabilities and then IAMStreamConfig::GetStreamCaps