Ich muss mich mit MPEG 2-Transportpaketen mit .NET beschäftigen. Was ist der beste Weg, das zu tun? Momentan überlege ich, OpenCV zu verwenden, aber noch nicht sicher, ob es möglich ist.
HINWEIS: Ich gehe davon aus, dass Sie Windows verwenden, da Sie auf .NET zielen möchten.
Ich habe es in der Vergangenheit getan.
Soweit ich weiß, gibt es keinen vollständigen .NET-Quellcode, den Sie verwenden können.
BEARBEITEN: OpenCV wird Ihnen bei Ihrer Aufgabe nicht helfen. Sie können OpenCV verwenden, um Video anzuzeigen (Es verwendet FFMPEG intern) Aber Sie haben keinen Zugriff auf die Pakete. Auch das Hacken der mit OpenCV gelieferten FFMPEG-Bibliothek ist nicht einfach, da es unter Windows vorkompiliert wird.
Der Weg zu gehen hängt tatsächlich von Ihren Bedürfnissen ab. Wenn Sie jedoch auf Paketebene arbeiten müssen, müssen Sie die MPEG2 TS-Spezifikation lernen. Wikipedia ist ein guter Ausgangspunkt, aber irgendwann müssen Sie die Spezifikation iso13818-1 und optional iso13818-2 lesen. Sie können Kopien davon im Internet finden - einfach googlen. Sie können einige Referenzimplementierungen in C / C ++ VLC, FFMPEG, libmpeg gstreamer (in den schlechten Plugins) finden, aber ich kann Ihnen versichern, dass sie schwer zu lesen und nicht sehr gut dokumentiert sind. Auch das Schreiben eines kompletten und robusten MPEG TS Muxers oder Demuxers ist eine schwierige Aufgabe, die eine langwierige Überprüfung der Dokumentation erfordert. Es gibt ein .NET-Tool namens "MPEG-2 Transport Stream Packet Analyzer", geschrieben in .NET. Es sieht wie eine vollständige Implementierung aus, aber der Code ist nicht frei verfügbar - vielleicht ist der Autor bereit, es Ihnen zu verkaufen. Sie können von Ссылка
darauf zugreifenAbhängig von Ihren C / C ++ - und Programmierfähigkeiten werde ich eine der folgenden Optionen empfehlen:
Ich würde die zweite Option empfehlen, es sei denn, Sie müssen Remixing oder andere schwerwiegende Manipulationen am Bitstream selbst durchführen.
Sie sollten bemerken, dass es angesichts der Komplexität des TS-Protokolls einfacher ist, mit C / C ++ zu manipulieren (was ich am Ende getan habe, nachdem ich mit C # begonnen habe) und es mit .NET inoperate.
Ich musste meinen eigenen Demuxer und Muxer für ein bestimmtes Projekt schreiben, das sehr spezifische Bedürfnisse hatte. Es war keine leichte Aufgabe (Die gesamte Sache dauerte ungefähr 300 Stunden, um richtig zu implementieren) und am Ende war das Ergebnis nicht so robust wie ein kommerzieller Muxer oder Demuxer von Elecard oder MainConcept - aber die Produkte von der Stange würden das nicht tun wir brauchten. Ich habe sie in C ++ geschrieben - DirectShow (In C ++) verwendet, um einen Quellfilter zu schreiben, der mit Elecard decodiert wurde (was damals besser funktionierte als MainConcept) und einen eigenen Renderer geschrieben hatte, um das eigentliche Video anzuzeigen. Die gesamte DirectShow-Kette wurde von C # über Interop gesteuert.
Sobald Sie Ihren Pfad ausgewählt haben, sollten Sie weitere Entscheidungen treffen, abhängig davon, was Sie mit den Paketen tun. Wenn Sie sie an einen Decoder oder einen Multiplexer senden möchten, können Sie DirectShow dafür verwenden. Sie müssen alles, was Sie tun, in einen Quellfilter, einen Filter oder einen Zielfilter umwandeln, je nachdem, wo Sie die Daten erhalten. Wenn Sie Ihren Filter in .NET implementieren möchten, können Sie die "Pure .NET DirectShow Filter in C #" von Maxim Kartawenkov Formular Ссылка . (Oder kaufen Sie das Elecard .NET SDK, wenn Sie kommerzielle Unterstützung benötigen). Es gibt einige Referenzfilter, mit denen Sie beginnen können, obwohl Sie auch die DirectShow-Dokumentation lesen müssen. Wenn man nur die Pakete ansieht, sie vielleicht ändert und sie zurückschreibt, dann ist es möglich, dass man seine eigene saubere Implementierung dafür schreiben oder in die mpegts-Implementierung von libavcodec hacken kann. Es ist nicht so kompliziert, nur stundenlang herauszufinden, was vor sich geht - Sehr lehrreich. libavcodec hat eine sehr saubere Schnittstelle, so dass Sie die geänderten Pakete einfach zurückbekommen können - Sie müssen jedoch auch die Dokumente dafür lesen.
Also, ich bin mir nicht sicher, ob das die Antwort ist, die Sie wollten, aber es gibt keinen einfachen Weg für das, was Sie wollen.
SDP-Dateien sind erstaunlich. Ich weiß nicht, ob Sie das auf einer Paketebene behandeln müssen, aber ich schreibe normalerweise eine SDP-Datei. Alle Media Player, mit denen ich getestet habe - Windows Media, VLC, Quicktime - unterstützt sie. Wenn Sie dann die Medien in eine Webseite, ein Formular oder in eine Aufnahme einbetten müssen, können Sie dies einfach von der API für den jeweiligen Player aus erreichen.
Die SDP-Datei übergibt die Container-, Codierungs- und Netzwerkinformationen, die der Player benötigt, um den Stream selbst zu erfassen.
Ich habe eine Menge Zeit damit verbracht, mit der direkten Show herumzuspielen, bis mir klar wurde, dass der Windows Media Player eine ziemlich gute Implementierung ist und alle Ihre Filter auf der Basis der SDP-Datei erstellt. Es ist ziemlich einfach. Hier ist die Spezifikation:
VLC hat auch eine wirklich gute API für diese Art von Sache.
Ich bin mir nicht sicher, ob ich Ihre Frage vollständig verstehe, wenn Sie .NET machen und MPEG-Pakete erfassen und dann etwas verarbeiten müssen, wäre OpenCV in Ordnung, würde aber vorschlagen, Aforge.NET Dies wird Ihnen helfen, Interops für OpenCV zu vermeiden. Es enthält eine breite Sammlung von Video-Processing-Bibliotheken und sollte für Sie nützlich sein.
Hier ist ein .NET-Beispiel , das HTTP-Live-Streaming-Wiedergabelisten verarbeitet ( .m3u8
files). Es lädt .ts
-Dateien in der Playlist in den Speicher und verwendet die NAudio-Bibliothek , um den Audio-Stream zu analysieren und zu extrahieren.