Кодирование видео в реальном времени в DirectShow - PullRequest
6 голосов
/ 02 июля 2010

Я разработал приложение для 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?Или, может, мне стоит использовать какой-нибудь внешний аппаратный видеокодер?

С уважением,

madbadger

Ответы [ 10 ]

4 голосов
/ 13 июля 2010

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

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

Смотрите это:

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

3 голосов
/ 05 июля 2010

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

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

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

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

1 голос
/ 05 августа 2011

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

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

1 голос
/ 27 октября 2010

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

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

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

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

1 голос
/ 15 октября 2010

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

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

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

1 голос
/ 07 июля 2010

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

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

0 голосов
/ 28 января 2015

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

0 голосов
/ 14 сентября 2012

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

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

0 голосов
/ 13 сентября 2012

Если вы можете остаться на уровне или ниже 1280x1024, кодировщик Micorsofts MPEG-2 (входит в Vista и выше) вполне хорош.

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

0 голосов
/ 03 июля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...