Как получить разрешение в реальном времени в 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()