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

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

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

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

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

С наилучшими пожеланиями,

сумасшедший барсук


person madbadger    schedule 02.07.2010    source источник
comment
Не знаю, нашли ли вы решение для этого, но тем временем я разработал кодировку транспортного потока для своего продукта - возможно, такое решение также будет приемлемо для вас, поскольку вы говорите о потоковой передаче через WiFi.   -  person Daniel Mošmondor    schedule 10.02.2011


Ответы (10)


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

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

Видеть это:

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

person kidjan    schedule 13.07.2010
comment
Кажется довольно сложным создать профиль и настроить ASFWriter для кодека WMV9. Также не нашел хорошего руководства по этому вопросу, только менее чем полезные документы MicroSoft. - person Macke; 13.09.2012

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

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

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

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

person Alan    schedule 05.07.2010
comment
Спасибо, я зарегистрировался для ознакомления с SDK MainConcept. О результатах напишу позже. - person madbadger; 08.07.2010
comment
Как и ожидалось, кодировщик CUDA H.264 от MainConcept работает достаточно быстро и хорошо документирован. Под достаточно быстрым я подразумеваю, что я могу добиться кодирования VGA 30 кадров в секунду в реальном времени на средней современной машине без видимой потери качества, а полученные файлы будут в 50-100 раз меньше, чем исходные несжатые файлы. Единственным недостатком является высокая цена комплектующих. - person madbadger; 09.08.2010
comment
Я писал коммерческие решения, используя фильтры MainConcept. Я обнаружил, что их мультиплексный фильтр H.264 пропускает память, а их поддержки очень не хватает. Однако их фильтры кодировщика и декодера великолепны. - person fishfood; 24.08.2012

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

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

person GrandmasterB    schedule 07.07.2010

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

Я предлагаю вам взглянуть на SDK MainConcept. Они делают серию фильтров DirectShow для кодирования H.264. Я реализовал потоковую передачу в реальном времени и мультиплексирование потоков, закодированных в H.264, используя кодек MainConcept и фильтры DirectShow, и это здорово.

Надеюсь это поможет

person Community    schedule 14.10.2010

Я использую Windows Media Encoder для кодирования в реальном времени, и он хорошо работает даже в разрешении 720x576. Одним из примеров его использования является VideoPhill Recorder.

Он написан на чистом .NET с использованием DirectShow.NET для захвата и windowsMedia.NET для кодирования.

Используя эти два, я могу добиться кодирования в реальном времени со стабильностью 24/7.

И обе библиотеки бесплатны для использования в Windows, поэтому вам не придется платить за какие-либо лицензии, кроме ОС.

person Daniel Mošmondor    schedule 27.10.2010

Тесты ffdshow используют возможности ffmpeg x264, которые, как говорят, довольно быстрые (во всяком случае, я так думаю). Также может помочь libjpeg-turbo или выбор другого кодека, предназначенного для высокой пропускной способности, например, camstudio или чего-то еще.

обновление: теперь ffmpeg может принимать данные DirectShow: http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=3&t=27

person rogerdpack    schedule 04.08.2011

Вы уже видели это?

http://www.streamcoders.com/products/rtpavsource.html http://www.streamcoders.com/products/rtpavrender.html

person Jeremiah Morrill    schedule 02.07.2010

Если вы можете оставаться на уровне 1280x1024 или ниже, кодировщик Micorsoft MPEG-2 (включенный в Vista и более поздние версии) вполне подойдет.

Однако я вообще не заставил его работать с контентом 1080p. Я подозреваю, что кодировщик просто прерывает это. Стыд.

person Macke    schedule 13.09.2012

Вот один из вариантов: http://www.codeproject.com/Articles/421869/H-264-CUDA-Encoder-DirectShow-Filter-in-Csharp

Он использует около 10% моего процессора (p4 3ghz) для кодирования SD-видео в h264 при редактировании графа.

person Thorgeir    schedule 13.09.2012

См. пример C# CaptureDS, который поставляется с AVBlocks. В нем показано, как собрать видеомагнитофон с AVBlocks и DirectShow. DirectShow используется для захвата видео, а AVBlocks — для кодирования видео:

person bxk    schedule 27.01.2015
comment
Не могли бы вы опубликовать основную часть кода по ссылке? - person Lizz; 28.01.2015