Различные подходы к получению захваченных видеокадров в DirectShow
Я использовал механизм обратного вызова для захвата кадров веб-камеры в моем мультимедийном приложении. Он работал, но был медленным из-за некоторых дополнительных буферных функций, которые выполнялись в самом обратном вызове.
Сейчас я пытаюсь другой способ получить кадры. То есть вызов метода и захват кадра (вместо обратного вызова). Я использовал пример в CodeProject, который использует IVMRWindowlessControl9::GetCurrentImage.
Я столкнулся со следующими проблемами.
- В веб-камере Microsoft предварительный просмотр не отображался (только черный экран) в Windows 7. Но та же камера отображала предварительный просмотр в XP.
Здесь я сомневаюсь, будут ли специфические функции VMR зависеть от драйверов камер на разных платформах? Иначе, как это могло произойти?
- Где бы ни работал пример приложения, я наблюдал, что член biBitCount полученной структуры BITMAPINFOHEADER равен 32.
Это значение устанавливается приложением или настройкой драйвера для операций VMR? Как это настроено? И, наконец, какой лучший способ захватить рамки веб-камеры? Подход обратного вызова? Или прямой подход?
Заранее спасибо,
1 ответ
IVMRWindowlessControl9::GetCurrentImage
предназначен для случайных снимков, а не для обычного захвата изображения.
Цитата из MSDN:
Этот метод может быть вызван в любое время, независимо от того, в каком состоянии находится фильтр, работает ли он, остановлен или приостановлен. Однако частые вызовы этого метода ухудшают производительность воспроизведения видео.
Этот метод считывает обратно из видеопамяти, что в первую очередь медленно. Этот метод преобразует (то есть снова медленно) в цветовое пространство RGB, поскольку этот формат наиболее подходит для приложений, не поддерживающих потоковую передачу, и дает меньше проблем с совместимостью.
В общем, вы можете использовать его для периодического захвата изображения, однако это не то, что вы должны делать. Для захвата с потоковой скоростью вам нужно использовать фильтр в конвейере или Sample Grabber с обратным вызовом.