Windows-Mobile Directshow: указание битрейта / качества видеозахвата WMV

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

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

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

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

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

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

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

Какие-либо предложения?

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

СПАСИБО!

1 ответ

Хорошо, я обошел ошибку при настройке значения propertybag (метод 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 Гц. Большая разница в размерах! Теперь я просто должен понять, как снизить настройки звука... >: (

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