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

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

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

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

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

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

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


person Cookie Cat    schedule 18.09.2015    source источник


Ответы (1)


Да, у Mediafoundation нет атрибута стиля PIN_CATEGORY_STILL.

Возможно, вы можете предположить, что тип носителя только с 1 кадром в секунду все еще является захватом.

ИЗМЕНИТЬ

продолжая исследование, есть MF_CAPTURE_ENGINE_STREAM_CATEGORY_PHOTO_DEPENDENT

Это относится к MFCaptureEngine и для Windows 8...

person mofo77    schedule 25.11.2015
comment
Да, это обходной путь, который я сейчас использую. Проверка на 1 кадр/с и на всякий случай для MFMediaType_Image, предполагая, что все, что соответствует этому, является захватом неподвижного изображения. - person Cookie Cat; 26.11.2015