Поделиться через


Обработка событий перекраски в видеозахвате

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Если вы создаете граф захвата видео без использования интерфейса ICaptureGraphBuilder2 и просматриваете видео с помощью старого фильтра Отрисовщика видео, необходимо переопределить обработку по умолчанию для событий EC_REPAINT . Запросите в диспетчере графов фильтров интерфейс IMediaEvent и вызовите метод IMediaEvent::CancelDefaultHandling со значением EC_REPAINT:

IMediaEvent *pEvent = 0;
hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
if (SUCCEEDED(hr))
{
    pEvent->CancelDefaultHandling (EC_REPAINT);
    pEvent->Release();
}

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

Если вы используете интерфейс ICaptureGraphBuilder2 , вам не нужно выполнять этот шаг, так как Построитель захвата Графов делает это автоматически. Кроме того, он не является обязательным, если вы используете отрисовщик смешанного видео (VMR) для предварительной версии. VmR всегда имеет последний доступный кадр, поэтому он не отправляет события EC_REPAINT.

Расширенные разделы по захвату

Уведомление о событиях в DirectShow