Media Foundation неправильно маркирует дескрипторы потоков захвата неподвижных изображений как захват видео

Я делаю захват видео с веб-камеры двумя разными способами (например, двумя приложениями): с помощью Direct Show и Media Foundation.

Используя Direct Show, моя веб-камера Logitech C920 имеет 3 выходных контакта:

  1. Захват видео (т.е. PIN_CATEGORY_CAPTURE или жеPIN_CATEGORY_PREVIEW) в пиксельных форматах I420, RGB24 и MJPG, с FPS от 2 до 30, в зависимости от типа носителя.
  2. Захват неподвижного изображения (т.е. PIN_CATEGORY_STILL) в I420 и RGB24 всего с 1 FPS.
  3. Захват видео (т.е. PIN_CATEGORY_CAPTURE или жеPIN_CATEGORY_PREVIEW) в h264 с FPS от 5 до 30.

Итак, поскольку я занимаюсь только захватом видео, я игнорирую все контакты, которые не PIN_CATEGORY_CAPTURE или же PIN_CATEGORY_PREVIEW, который прекрасно работает.

Используя Media Foundation, та же камера имеет 3 потоковых дескриптора (IMFPresentationDescriptor::GetStreamDescriptorCount). Каждый дескриптор потока обеспечивает IMFMediaTypeHandler это позволяет вам перебирать типы медиа. Итак, у меня есть 3 IMFMediaTypeHandlers:

  1. Захват видео (т.е. IMFMediaTypeHandler::GetMajorType == MFMediaType_Video) в пиксельных форматах I420, RGB24 и MJPG, с FPS от 2 до 30, в зависимости от типа носителя.
  2. Захват видео (т.е. IMFMediaTypeHandler::GetMajorType == MFMediaType_Video) в i420 и RGB24 всего с 1 FPS.
  3. Захват видео (т.е. 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...

Другие вопросы по тегам