Видео кодиране в реално време в DirectShow

Разработих приложение за Windows, което заснема видео от външно устройство с помощта на DirectShow. Разделителната способност на изображението е 640x480, а видеоклиповете, записани без компресия, имат много огромни размери (приблизително 27MB в секунда).

Целта ми е да намаля този размер колкото е възможно повече, така че търся енкодер, който ще ми позволи да компресирам видеото в реално време. Може да е H.264, MPEG-2 или нещо друго. Трябва да ми позволи да запазя видеото на диск и би било най-добре, ако мога също така да го предавам в реално време през мрежа (Wi-Fi, така че размерът трябва да бъде около 1 MB в секунда или по-малко). Значителната загуба на качество би била неприемлива.

Разбрах, че получаването на подходящ 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 mbit/sec (1 MB/sec), качеството не е проблем за вас. 2 mbit/sec, 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's продукти преди. Те обаче са в скъпия край на спектъра.

person Alan    schedule 05.07.2010
comment
Благодаря, регистрирах се за оценка на SDK на MainConcept. Ще пиша за резултатите по-късно. - person madbadger; 08.07.2010
comment
Точно както се очакваше, енкодерът CUDA H.264 на MainConcept е достатъчно бърз и добре документиран. Под достатъчно бърз имам предвид, че мога да постигна кодиране в реално време VGA 30fps на средна модерна машина без видима загуба на качество и получените файлове са 50-100 пъти по-малки от оригиналните некомпресирани. Единственият недостатък е високата цена на компонентите. - person madbadger; 09.08.2010
comment
Написах търговски решения, използвайки филтрите на MainConcept. Открих, че техният H.264 mux филтър изпуска памет и поддръжката им липсва много. Филтрите им за енкодер и декодер обаче са страхотни. - 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 изпробванията използват x264 нещата на ffmpeg, за които се казва, че са доста бързи (все пак мисля така). Също така може да помогне 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, енкодерът MPEG-2 на Micorsoft (включен във 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

Вижте примера за CaptureDS C#, който се доставя с AVBlocks. Показва как да създадете видеорекордер с AVBlocks и DirectShow. DirectShow се използва за заснемане на видео, а AVBlocks се използва за кодиране на видео:

person bxk    schedule 27.01.2015
comment
Можете ли да публикувате основната част от кода от връзката? - person Lizz; 28.01.2015