Windows-Mobile Directshow: указание битрейта / качества видеозахвата WMV - PullRequest
0 голосов
/ 09 февраля 2010

Я в замешательстве и очень надеюсь, что кто-нибудь может указать мне правильное направление.

В настоящее время я снимаю видео в Windows Mobile и кодирую его с помощью WMV 9 DMO (CLSID_CWMV9EncMediaObject). Это все работает достаточно хорошо, но битрейт выходного видео слишком высок, в результате чего видеофайл слишком велик для моих нужд.

В конечном счете, моя цель состоит в том, чтобы имитировать настройки видео, которые Microsoft Camera Capture Dialog выводит в режиме качества обмена сообщениями (64kbps) из моего кода C ++. В настоящее время мой код вывод файла WMV с битрейтом 352 кбит / с.

Единственный пример, который я мог найти для определения битрейта захвата с DMO WMV9, был this . Идея в этом коде заключалась в том, чтобы использовать пакет свойств для записи битрейта в свойство DMO.

Обновление: В Windows Mobile самое близкое свойство кодека, которое я могу найти, которое, по-видимому, соответствует битрейту, это "g_wszWMVCVBRQuality". Документация Microsoft этого свойства меня крайне смущает: в основном кажется, что большее число соответствует более высокому качеству, но оно абсолютно не объясняет специфику каждого числа. Когда я пытаюсь установить для этого свойства значение «1» через пакет свойств для DMO WMV9, я сталкиваюсь с ошибкой -2147467259 (неизвестно).

Подводя итог: Какова основная стратегия для определения битрейта / качества видео, записываемого с помощью DirectShow (wmv9) на платформе Windows Mobile? Я слышал (или задавался вопросом) следующие методы:

  1. Используйте пакет свойств, чтобы изменить свойство DMO кодера, соответствующее битрейту / качеству (в настоящее время не работает)
  2. Создайте свой собственный транскодер / кодировщик, чтобы указать его. Это кажется ненужным, поскольку кодировщик WMV работает достаточно хорошо - он просто на слишком высокой скорости передачи битов.
  3. VIDEOINFOHEADER имеет свойство битрейта, но я подозреваю, что указание здесь новых настроек не изменит фактического процесса кодирования, поскольку я не думаю, что атрибуты файла вступят в действие до окончания кодирования.

Есть предложения?

PS: Я бы опубликовал конкретный исходный код, но на данный момент это может сбить с толку больше, чем помогает, так как я очень много путаюсь в том, как это сделать. На данный момент я просто пытаюсь проверить общую стратегию.

СПАСИБО!

1 Ответ

1 голос
/ 10 февраля 2010

Хорошо, я обошел ошибку при установке значения пакета свойств (метод 1), и теперь я могу программно установить «качество» видео без инцидентов.

Я делал все не по порядку. Вы можете успешно изменить настройки, как я описал (и связан с ними), если вы сделаете это после добавления кодера WMV9 DMO график, но за до вызывается renderstream. Используйте пакет свойств вместе с VARIANT, чтобы внести изменения в DMO (опять же, я использую CLSID_DMOWrapperFilter) свойство g_wszWMVCVBRQuality. Для Windows Mobile это глобальное значение определяется в файле wmcodecstrs.h пакета SDK для Windows Mobile 6.

Как правило, чем ниже установленное значение, тем хуже качество. Точно так же как MS документы сказали; )
Например, если установить значение 1, видео будет выглядеть ужасно.

Кстати, разница в размерах между моими видео с кодом dshow и видео, созданным с помощью CCD, была вызвана не битрейтом видеопотока, а звуковым потоком, который передавался в видеофайл. Согласно VLC Media Player, видео CCD было 8-битным аудио на 8000 Гц, в то время как видео моего кода было 16-битным аудио на 22050 Гц. Большая разница в размерах! Теперь мне нужно выяснить, как уменьшить настройки звука ... >: (* ​​1017 *

...