Кодирование видео реального времени в DirectShow

Я разработал Приложение Windows, которое записывает видео от внешнего устройства с помощью DirectShow. Разрешение изображения 640x480, и видео, сохраненные без сжатия, имеют очень огромные размеры (приблизительно 27 МБ в секунду).

Моя цель состоит в том, чтобы уменьшить этот размер как можно больше, таким образом, я ищу кодер, который позволит мне сжимать видео в режиме реального времени. Это мог быть H.264, MPEG-2 или что-либо еще. Это должно позволить мне сохранять видео на диск, и было бы лучше, если я также мог бы передать его потоком в режиме реального времени по сети (Wi-Fi, таким образом, размер должен составить приблизительно 1 МБ в секунду, или меньше). Значительная качественная потеря была бы недопустима.

Я узнал, что получение соответствующего фильтра DirectShow для этой задачи является очень трудным. Можно предположить, что клиентская машина довольно современна (быстрое 2 ядра процессора) и может использовать CUDA/OpenCL. Существует несколько приложений, которые позволяют кодировать видео с помощью CUDA и предлагать хорошую производительность, однако я не нашел соответствующий фильтр DirectShow или API, который мог использоваться для разработки того. nvcuvenc.dll NVIDIA, кажется, имеет частный API, таким образом, я не могу использовать его непосредственно. Любые основанные на ЦП кодеры, которые я нашел, являются слишком медленными для моих требований, но возможно я скучал по некоторым.

Кто-либо мог рекомендовать мне решение, т.е. кодер (заплаченный или свободный, который может использоваться в приложении с закрытым исходным кодом), который может достигнуть хорошей производительности, независимо использует ли это CPU/CUDA/OpenCL или DirectCompute? Или возможно я должен использовать некоторый кодер видео внешнего оборудования?

С уважением,

madbadger

6
задан madbadger 2 July 2010 в 15:22
поделиться

4 ответа

Какие фильтры вы пробовали?

Если вы имеете дело только с разрешением 640x480, тогда подойдет любой коммерческий программный кодировщик разумного качества, если вы выберете реалистичный битрейт. Аппаратное ускорение с использованием Cuda или OpenCL не требуется. H264 требует немного больше мощности и требует больше ядер процессора, но Mpeg2 или любой из кодеков эпохи h263 (xvid, wmv9, divx и т. Д.) Не должны иметь проблем даже на скромном процессоре. Одновременная потоковая передача по сети требует немного больше усилий, но все же возможна.

Он не основан на DirectShow, но VLC Media Player может все это делать. Он основан на проекте с открытым исходным кодом FFMpeg . Некоторые версии имеют лицензию LGPL, поэтому библиотека может быть включена в ваш проект без особых ограничений.

Если вам нужен только набор фильтров DirectShow, которые справятся со всем этим за вас, я уже добивался хороших результатов с продуктами MainConcept и раньше. Однако они находятся в самом дорогом конце спектра.

3
ответ дан 9 December 2019 в 22:28
поделиться

Вы не указываете, какие фильтры вы пробовали, или что означает «значительная» потеря качества, поэтому лучшее, что я подозреваю, мы можем сделать, это предложить некоторым кодировщикам попытаться увидеть, соответствуют ли они вашим требованиям.

Двумя хорошими из них являются фильтры видеокодеров Theora и WebM (вы можете получить их у одного установщика на xiph.org). Они оба являются высококачественными кодировщиками, которые можно настроить, чтобы сбалансировать производительность и качество. WebM может использовать несколько процессоров при кодировании, что может помочь в вашей ситуации. Оба также используются с видео HTML5, так что это может быть дополнительным плюсом для вас.

1
ответ дан 9 December 2019 в 22:28
поделиться

Поскольку вы используете Directshow, проще всего было бы использовать WMV9 внутри контейнера ASF. Это проще, потому что он доступен почти на всех компьютерах с Windows (очень мало зависимостей от времени установки), довольно быстро (у вас не должно возникнуть проблем с его использованием на достаточно современном компьютере) и качество приемлемое. Но учитывая, что ваш лимит составляет 8 Мбит / сек (1 МБ / сек), качество для вас не проблема. 2 мбит / сек, VGA-разрешение WMV9 должно выглядеть неплохо.

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

См. Это:

http://msdn.microsoft.com/en-us/library/dd375008%28v=VS.85%29.aspx

4
ответ дан 9 December 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: