Я делаю захват видео с веб-камеры двумя разными способами (например, двумя приложениями): с помощью Direct Show и Media Foundation.
Используя Direct Show, моя веб-камера Logitech C920 имеет 3 выходных контакта:
PIN_CATEGORY_CAPTURE
или жеPIN_CATEGORY_PREVIEW
) в пиксельных форматах I420, RGB24 и MJPG, сPIN_CATEGORY_STILL
) в I420 и RGB24PIN_CATEGORY_CAPTURE
или жеPIN_CATEGORY_PREVIEW
) в h264 с FPS от 5 до 30.Итак, поскольку я занимаюсь только захватом видео, я игнорирую все контакты, которые не PIN_CATEGORY_CAPTURE
или же PIN_CATEGORY_PREVIEW
, который прекрасно работает.
Используя Media Foundation, та же камера имеет 3 потоковых дескриптора (IMFPresentationDescriptor::GetStreamDescriptorCount
). Каждый дескриптор потока обеспечивает IMFMediaTypeHandler
это позволяет вам перебирать типы медиа. Итак, у меня есть 3 IMFMediaTypeHandlers:
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
) в пиксельных форматах I420, RGB24 и MJPG, сIMFMediaTypeHandler::GetMajorType == MFMediaType_Video
) в i420 и RGB24IMFMediaTypeHandler::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)?
Да, у Mediafoundation нет атрибута стиля PIN_CATEGORY_STILL.
Возможно, вы можете предположить, что тип носителя с частотой всего 1 кадр / с все еще используется.
РЕДАКТИРОВАТЬ
делая еще несколько исследований, есть MF_CAPTURE_ENGINE_STREAM_CATEGORY_PHOTO_DEPENDENT
Это относится к MFCaptureEngine и для Windows 8 …