2010-07-02 10 views
5

Ich habe eine Windows-Anwendung entwickelt, die Video von einem externen Gerät mit DirectShow aufnimmt. Die Bildauflösung beträgt 640x480 und die Videos ohne Komprimierung haben sehr große Größen (ca. 27MB pro Sekunde).Echtzeit-Videokodierung in DirectShow

Mein Ziel ist es, diese Größe so weit wie möglich zu reduzieren, also suche ich nach einem Encoder, mit dem ich das Video in Echtzeit komprimieren kann. Es könnte H.264, MPEG-2 oder irgendetwas anderes sein. Es muss mir erlauben, das Video auf Festplatte zu speichern, und es wäre am besten, wenn ich es auch in Echtzeit über das Netzwerk streamen könnte (Wi-Fi, also sollte die Größe etwa 1 MB pro Sekunde oder weniger betragen). Der erhebliche Qualitätsverlust wäre inakzeptabel.

Ich habe herausgefunden, dass es sehr schwierig ist, einen geeigneten DirectShow-Filter für diese Aufgabe zu bekommen. Es kann davon ausgegangen werden, dass der Client-Rechner einigermaßen modern ist (schnelle 2-Kern-CPU) und CUDA/OpenCL nutzen kann. Es gibt ein paar Apps, die es erlauben, Video mit CUDA zu kodieren und eine gute Leistung zu bieten, aber ich habe keinen passenden DirectShow-Filter oder eine API gefunden, mit der man einen entwickeln könnte. Die NVIDIA nvcuvenc.dll scheint private API zu haben, so dass ich sie nicht direkt verwenden kann. Alle CPU-basierten Encoder, die ich gefunden habe, sind zu langsam für meine Anforderungen, aber vielleicht habe ich etwas verpasst.

Kann mir jemand eine Lösung empfehlen, d. H. Einen Encoder (kostenpflichtig oder kostenlos, der in einer Closed-Source-App verwendet werden kann), der eine gute Leistung erzielen kann, unabhängig davon, ob er CPU/CUDA/OpenCL oder DirectCompute verwendet? Oder sollte ich vielleicht einen externen Hardware-Video-Encoder verwenden?

Mit freundlichen Grüßen,

MadBadger

+0

Ich weiß nicht, ob Sie eine Lösung dafür gefunden haben, aber in der Zwischenzeit habe ich die Transport Stream-Kodierung für mein Produkt entwickelt - vielleicht wäre eine solche Lösung auch akzeptabel Sie, seit Sie über das Streaming über das WiFi sprechen –

Antwort

3

Welche Filter Sie versucht haben?

Wenn Sie nur mit 640x480 arbeiten, dann sollte jeder kommerzielle Software-basierte Kodierer in vernünftiger Qualität in Ordnung sein, solange Sie eine realistische Bitrate wählen. Hardwarebeschleunigung mit Cuda oder OpenCL sollte nicht erforderlich sein. H264 benötigt ein wenig mehr Leistung und würde mehr CPU-Kerne benötigen, aber Mpeg2 oder einer der Codecs der h263-Ära (xvid, wmv9, divx usw.) sollte selbst auf einer bescheidenen CPU keine Probleme haben. Gleichzeitiges Streaming über das Netzwerk erfordert etwas mehr Aufwand, sollte aber dennoch möglich sein.

Es ist nicht DirectShow-basiert, aber VLC Media Player kann all dies tun. Es basiert auf dem Open-Source-Projekt FFMpeg. Einige Versionen davon sind LGPL-lizensiert, so dass die Bibliothek ohne Einschränkungen in Ihr Projekt eingebunden werden kann.

Wenn Sie nur eine Reihe von DirectShow-Filter, die all dies für Sie behandeln möchten, habe ich gute Ergebnisse mit MainConcept's Produkte zuvor. Sie sind jedoch am teuren Ende des Spektrums.

+0

Danke, ich habe für die Bewertung von MainConcept SDKs registriert. Ich werde später über die Ergebnisse schreiben. – madbadger

+0

Wie erwartet, ist der CUDA H.264-Encoder von MainConcept schnell genug und gut dokumentiert. Mit "schnell genug" meine ich, dass ich Echtzeit-VGA-30fps-Kodierung auf einer durchschnittlichen modernen Maschine ohne sichtbaren Qualitätsverlust erreichen kann und die resultierenden Dateien 50-100 mal kleiner sind als die ursprünglichen nicht komprimierten. Der einzige Nachteil ist der hohe Preis der Komponenten. – madbadger

+0

Ich habe kommerzielle Lösungen mit MainConcept Filtern geschrieben. Ich fand, dass ihr H.264-Mux-Filter Speicher durchsickerte und ihre Unterstützung sehr fehlte. Deren Encoder- und Decoderfilter sind allerdings großartig. – fishfood

1

Sie geben nicht an, welche Filter Sie ausprobiert haben, oder was "signifikanter" Qualitätsverlust bedeutet, also über das Beste, was ich vermute, sind Encoder, die versuchen zu sehen, ob sie Ihren Anforderungen entsprechen.

Zwei gute sind die Video Encoder Filter Theora und WebM (Sie können sie von einem einzigen Installer bei xiph.org erhalten). Sie sind beide hochwertige Encoder, die optimiert werden können, um Leistung und Qualität auszugleichen. WebM kann beim Kodieren mehrere Prozessoren verwenden, was in Ihrer Situation hilfreich sein kann. Beide werden auch mit HTML5-Video verwendet, so dass dies ein zusätzliches Plus für Sie sein könnte.

4

Da Sie DirectShow verwenden, ist es am einfachsten, WMV9 in einem ASF-Container zu verwenden. Dies ist einfacher, da es auf fast allen Windows-Rechnern verfügbar ist (sehr wenige Installationszeitabhängigkeiten), ziemlich schnell (Sie sollten keine Probleme haben, es auf einem einigermaßen modernen Rechner zu benutzen) und die Qualität ist vernünftig. Da Ihr Limit jedoch 8 MBit/Sek. (1 MB/Sek.) Beträgt, ist Qualität für Sie kein Problem. 2 MBit/s, VGA-Auflösung WMV9 sollte ziemlich gut aussehen.

Es ist nicht annähernd so gut wie eine anständige Implementierung von H264, aber vom Standpunkt der Implementierung aus sparen Sie sich viel Zeit, indem Sie diesen Weg gehen.

sehen:

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

+0

Es scheint recht schwierig, ein Profil zu erstellen und den ASFWriter für den WMV9-Codec zu konfigurieren. Ich habe auch keine gute Anleitung dazu gefunden, nur MicroSofts weniger als hilfreiche Dokumente. – Macke

1

über WMV-Codierung für die Echtzeit-Streaming-Forget. WMV funktioniert gut für Echtzeit-Streams niedriger Qualität, aber es führt keine hochqualitative Codierung in Echtzeit durch.

Ich schlage vor, dass Sie einen Blick auf MainConcept's SDK werfen. Sie machen eine Reihe von DirectShow-Filtern zum Kodieren von H.264. Ich habe Echtzeit-Streaming und Muxing von in H.264 kodierten Streams mit MainConcepts Codec- und DirectShow-Filtern implementiert, und das ist großartig.

hoffe, das hilft

1

Ich verwende Windows Media Encoder für die Echtzeit-Codierung, und es funktioniert gut, auch in der Auflösung 720x576. Ein solches Beispiel für die Verwendung ist in VideoPhill Recorder.

Es ist in reinem .NET mit DirectShow.NET für die Erfassung und windowsMedia.NET für die Codierung geschrieben.

Mit diesen beiden bin ich in der Lage, Echtzeit-Codierung mit 24/7 Stabilität zu erreichen.

Und beide Bibliotheken können kostenlos unter Windows verwendet werden, so dass Sie außer OS keine Lizenzen bezahlen müssen.

1

ffdshow Tryouts nutzen ffmpeg x264 Sachen, die gesagt wird, ziemlich schnell zu sein (denke ich jedenfalls). Auch Libjpeg-Turbo könnte helfen, oder einen anderen Codec für hohen Durchsatz wie Camstudio oder was auch immer.

Update: ffmpeg kann jetzt Directshow-Eingang nehmen: http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=3&t=27

0

Wenn Sie auf oder unter 1280x1024 bleiben können, Micorsofts MPEG-2-Encoder (in Vista enthalten und nach oben) recht gut.

Ich habe es aber überhaupt nicht für 1080p Inhalt arbeiten. Ich vermute, der Encoder bricht gerade ab. Schande.

+0

nicht unterstützt auf Win x64 – Ludwo

0

Siehe CaptureDS C# -Probe, die mit AVBlocks geliefert wird. Es zeigt, wie man einen Videorecorder mit AVBlocks und DirectShow erstellt.DirectShow wird für die Videoaufnahme verwendet und AVBlocks wird für die Videokodierung verwendet:

+0

Könnten Sie bitte den Kernteil des Codes aus dem Link veröffentlichen? – Lizz