Я делаю захват видео с веб-камеры двумя разными способами (думаю, два приложения): используя Direct Show и Media Foundation.
Используя Direct Show, моя веб-камера Logitech c920 имеет 3 выходных контакта:
- Захват видео (то есть
PIN_CATEGORY_CAPTURE
илиPIN_CATEGORY_PREVIEW
) в пиксельных форматах I420, RGB24 и MJPG с частотой кадров от 2 до 30 в зависимости от типа носителя. - Захват неподвижного изображения (т. е.
PIN_CATEGORY_STILL
) в форматах I420 и RGB24 со скоростью всего 1 кадр/с. - Захват видео (т.е.
PIN_CATEGORY_CAPTURE
илиPIN_CATEGORY_PREVIEW
) в формате h264 с FPS от 5 до 30.
Итак, поскольку меня интересует только захват видео, я игнорирую все контакты, отличные от PIN_CATEGORY_CAPTURE
или PIN_CATEGORY_PREVIEW
, что прекрасно работает.
Используя Media Foundation, одна и та же камера имеет 3 дескриптора потока (IMFPresentationDescriptor::GetStreamDescriptorCount
). Каждый дескриптор потока предоставляет IMFMediaTypeHandler
, который позволяет перебирать типы мультимедиа. Итак, у меня есть 3 обработчика IMFMediaTypeHandler:
- Захват видео (т. е.
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
) в пиксельных форматах I420, RGB24 и MJPG с частотой кадров от 2 до 30 в зависимости от типа носителя. - Захват видео (то есть
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
) в i420 и RGB24 со скоростью всего 1 кадр/с. - Захват видео (т.е.
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
) в формате h264 с FPS от 5 до 30.
Вы можете заметить, что дескрипторы потока Media Foundation, кажется, сопоставляются с выходными контактами Direct Show 1 на 1. За исключением того, что Media Foundation не помечает дескриптор потока #2 как захват неподвижного изображения (MFMediaType_Image
), в отличие от того, что делает Direct Show.
Захват неподвижного изображения требует другой обработки, чем захват видео, поэтому мой код Direct Show дает ошибки и вообще не выполняет никакого захвата при попытке использовать типы мультимедиа с контакта № 2. Ну, в первую очередь меня волнует только захват видео, так что все в порядке.
Но даже через Media Foundation сообщает, что дескриптор потока № 2 является захватом видео, мой код Media Foundation, который отлично работает со всеми типами медиа из дескрипторов Steam № 1 и № 3, дает сбой на типах медиа из дескриптора потока № 2, аналогично тому, как Direct Show аварийно завершает работу только при захвате неподвижного изображения.
Поэтому у меня сложилось впечатление, что это либо Media Foundation (или драйвер веб-камеры Windows 7 предоставленный Logitech) содержит ошибки и не помечает дескриптор потока #2 как захват неподвижного изображения, когда это необходимо, или я проверяю неправильный флаг, чтобы определить, является ли это захватом видео или захватом неподвижного изображения. Если это моя ошибка, то как правильно различать дескрипторы потока захвата видео (№ 1 и № 3) и неподвижного изображения (№ 2)?