Как получить разрешение в реальном времени в DirectShow?

Как получить текущее разрешение SamleGrabber в DirectShow?

Я попробовал приведенный ниже код, он не работает. Полученное значение всегда составляет 1920x1080, а исходное разрешение изменилось с 1920x1080 до 1680x1050.

void GetCurrentResolution(ISampleGrabber* pGrabber, int* pWidth, int* pHeight) 
{
    AM_MEDIA_TYPE pmt = {0};
    hr = pGrabber->GetConnectedMediaType(&pmt);
    if (SUCCEEDED(hr)) 
    {
        if(pmt.formattype == FORMAT_VideoInfo) 
        {
            VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)pmt.pbFormat;
            *pWidth = pVih->bmiHeader.biWidth;
            *pHeight = pVih->bmiHeader.biHeight;
        }
        FreeMediaType(pmt);
    }
}

2 ответа

Приведенный вами фрагмент кода является правильным. Это не точно, потому что предполагает то, что не должно происходить, но в большинстве случаев это сработает.

Ваше неверное предположение заключается в том, что разрешение может измениться на работающем графике. Нет, этого не происходит: типовые типы носителей Grabber на контактах не меняются после подключения. Если есть необходимость в повторном согласовании разрешения, вам нужно начать с повторного подключения выводов, обычно начиная с выходных выводов.

Попробуй это:

Когда разрешение меняется: вызовите pGraph->Stop(); затем перезапустите и вызовите pGraph->Run()

Другие вопросы по тегам