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