2015-08-05 5 views
1

Я пытаюсь победить VFW из моего приложения C#. Большинство вещей было довольно туманным, и в конце концов я дошел до последнего момента, прежде чем это будет сделано.Формат изображения по умолчанию, возвращаемый VFW (C#), имеет некоторые недокументированные значения

Когда я инициирую драйвер камеры с группой сообщений, как

  • WM_CAP_GET_VIDEOFORMAT
  • WM_CAP_SET_VIDEOFORMAT

затем я получаю указатель на структуру BITMAPINFO на GET_VIDEOFORMAT где (как я полагаю, потому что вебкамера Безразлично У меня установлен его собственный драйвер) один элемент в структуре, называемый biCompression с очень странным значением = 0x32595559 (844715353). Всегда одно и то же значение, а RGBQUAD - все нули. Pls, увидеть снимок, где это значение находится в десятичном формате: screen cut from VS2012

Когда я звоню из VFW Диалог с выбором формата видео, я могу видеть YUY2 (который выбирается и в состоянии быть установлен), и MJPG, который который может быть выбран, но это приводит к тому, что черный экран становится результатом захвата видео.

Когда я вызываю SET_VIDEOFORMAT и отправляю в VFW стандартный формат BMP RGB 640x480 без сжатия, он возвращает 0 (ноль) в SendMessage, что означает, что он не может быть установлен. И, в то же время, отправляя структуру со странным значением сжатия, полученным в GET_VIDEOFORMAT, обратно как SET_VIDEOFORMAT, возвращает 1, и это означает, что VFW принял его.

Так что мне интересно, почему? Либо OS (Win7) не имеет определенного кодека для обычного BMP несжатого, либо потому, что у веб-камеры нет установленного драйвера?

И еще вопрос: что означает значение 0x32595559 в элементе сжатия BITMAPINFO?

Я уже рассматривал его как обычные 24-битные данные YUV, но получилось изображение B & W, без цвета, хотя во время потоковой передачи видео покрашено, и если я получаю его из буфера обмена, он также окрашен.

Как лечить такое столкновение, пожалуйста, помогите мне, если вы знаете это. Если вы очень хорошо справитесь с этим, я буду рад $$.

Спасибо.

UPD. Ничего себе, благодаря моей спонтанной идее передачи десятичных данных в шестнадцатеричный (значение сжатия) я нашел в Google свой код сжатия кодека YUY2. Полный стол here

Хорошо, но вопрос по-прежнему остается без ответа. Если ПК не будет содержать надлежащий кодек для RGB Bitmap несжатого, то что на самом деле происходит в VFW BOX, когда я отправляю SET_VIDEOFORMAT? Он ищет подходящий кодек и пытается подключить его к существующему графику потокового видео?

Я думаю, что ответ на этот вопрос поможет получить VFW для всех.

+0

Если вы хотите использовать сжатие, вам нужно будет сделать снизу вверх изображение. height = -480 вместо 480. Не знаете, как это сделать в вашем приложении. – Yaur

+0

Вы уже поняли, что код означает YUY2. Теперь все, что вам нужно сделать, это вставить на выходной вывод фильтр преобразования, который переводит YUY2 в RGB и подключит ваш рендерер или что-то еще к нему. В качестве альтернативы вы можете поместить туда тройник и подключить трансформатор к одному из штырей тройника и захватить его оттуда. Зависит от того, что вы пытаетесь с этим сделать. Я не знаком с библиотекой, поэтому я не знаю, какое влияние вы оказываете на график фильтра. Звучит как обертка вокруг DShow для меня. –

+0

Привет, Франк, спасибо за отзыв. Я имею дело с VFW, и я уже сделал преобразование из YUY2 в Bitmap. Он работает нормально. То, что я пытаюсь понять, это ... что происходит на SET_VIDEOFORMAT, потому что, если я прав. и он действительно ищет подходящий CODEC для привязки к текущему графику, а затем лучше для каждого клиента использовать кодек YUV2, и использовать преобразование из YUV2 в RGD24bpp. –

ответ

0

0x32595559 означает «YUY2» буквально. Чтобы построить эту константу в коде C++, вы бы сделали MAKEFOURCC('Y', 'U', 'Y', '2'). Это [хорошо известное] значение указывает, что захваченные видеоданные будут кодироваться с использованием этого формата пикселей.

WM_CAP_SET_VIDEOFORMAT и WM_CAP_GET_VIDEOFORMAT позволяют устанавливать и получать формат видеозахвата, однако диапазон принятых значений ограничен фактической поддержкой в ​​самой камере, поддерживаемой соответствующим драйвером. Это не связано с установленными кодеками, потому что программные кодеки не расширяют возможности камеры для кодирования захваченного видео.

Также здесь нет видеопотока, вы спрашиваете о API VFW, а графики - из другого API DirectShow. Используя VFW, вы получаете видеокадр в одном из форматов, поддерживаемых камерой (и настроен для доставки видео), тогда вы сами по себе с этими данными, и вы предпочитаете другую кодировку, вы можете захотеть найти подходящий ICM/VCM кодек вверх и конвертировать.

+0

Хорошо, сама камера уже имеет кодер внутри своего набора микросхем. Как узнать, какой кодек установлен по умолчанию в камере? –

+0

DirectShow позволяет строить графики с помощью pin, используя com tech, где у нас есть поток, а затем присоединяем к нему кодек, а затем в конце этого кодека используется еще один кодек (декодирование), поэтому мы можем получить видеопоток в желаемом формате а затем захватить видео и/или аудио. Есть ли способ сделать это в VFW? –

+0

С VFW я не думаю, что вы можете перечислять возможности. Вы можете использовать только пользовательский интерфейс, чтобы изменить его в интерактивном режиме, а затем получить/установить текущий формат. Нет, у вас нет аналогового синтезатора DirectShow в VFW. –