2010-07-02 3 views
5

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

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

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

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

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

madbadger

+0

Не знаю, нашли ли вы решение для этого, но тем временем я разработал кодировку транспортного потока для моего продукта - возможно, такое решение было бы приемлемым для вы, поскольку вы говорите о потоковой передаче по WiFi –

ответ

3

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

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

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

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

+0

Спасибо, я зарегистрировался для оценки SDK MainConcept. Я напишу о результатах позже. – madbadger

+0

Как и следовало ожидать, кодер CUDA H.264 от MainConcept достаточно быстр и хорошо документирован. Под «достаточно быстро» я имею в виду, что я могу добиться кодирования VGA 30fps в реальном времени на средней современной машине без видимой потери качества, а полученные файлы в 50-100 раз меньше исходных несжатых. Единственным недостатком является высокая стоимость компонентов. – madbadger

+0

Я написал коммерческие решения, используя фильтры MainConcept. Я обнаружил, что их фильтр H.264 mux просочился в память, и их поддержка очень не хватает. Их фильтры кодировщика и декодера великолепны. – fishfood

1

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

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

4

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

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

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

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

+0

Кажется довольно сложным создать профиль и настроить ASFWriter для кодека WMV9. Не нашли никакого хорошего руководства для этого, просто для менее полезных документов MicroSoft. – Macke

1

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

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

Надеется, что это помогает

1

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

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

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

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

1

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

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

0

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

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

+0

не поддерживается на Win x64 – Ludwo

0

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

+0

Не могли бы вы разместить основную часть кода по ссылке? – Lizz

 Смежные вопросы

  • Нет связанных вопросов^_^