[c++] Abspielen eines benutzerdefinierten Avi-Datenstroms mit QtMultimedia



0 Answers

Es sieht so aus, als ob Qt das Konzept der Datenströme bereits zu einem gewissen Grad unterstützt - http://doc.qt.io/qt-5/qmediastreamscontrol.html#details zeigt, dass es zu den auswählbaren Arten von Streams für ein qmediastreamscontrol gehört.

Andere Dokumente, einschließlich http://doc.qt.io/qt-5/qmediaserviceproviderplugin.html schlagen vor, dass Sie ein QMediaServiceProviderPlugin erstellen QMediaServiceProviderPlugin , das QMediaControl-Schnittstellen für Video und Audio implementiert (möglicherweise durch Unterklassifizierung eines vorhandenen Mediendienstanbieters) und auch eigene erstellt QMediaControl Schnittstellenunterklasse zum Erstellen eines Controls für die Verarbeitung Ihrer Rohdaten.

Wenn Sie dies hoffentlich implementieren, können Sie vorhandene Funktionen zum Teilen der Streams, zum Behandeln von Headern und ähnlichen Funktionen verwenden.

Leider scheinen die Besonderheiten des Aufbaus eines QMediaService "außerhalb des Geltungsbereichs dieser Dokumentation zu liegen und es sollte Unterstützung auf den relevanten Mailinglisten oder IRC-Kanälen gesucht werden." ( http://doc.qt.io/qt-5/qmediaservice.html#details ). Die Quelle ( http://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/multimedia ) könnte jedoch dazu nützlich sein, zusätzlich zu der Quelle unter http://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/plugins , das die Plugins directshow / gstreamer / coreaudio enthält.

In jedem Fall würde ich versuchen, so wenig wie möglich Unterklassen zu bilden und umzusetzen

Question

Ich muss eine benutzerdefinierte AVI-Datei wiedergeben, die einen klassischen Videostream, einen Audiostream, aber auch einen benutzerdefinierten Datenstrom enthält .

Der benutzerdefinierte Stream enthält Daten, die von einigen benutzerdefinierten Widgets visualisiert werden. Diese Widgets benötigen nur, dass jeder benutzerdefinierte Frame zur richtigen Zeit in einen Puffer geschrieben wird.

Unsere Anwendung basiert auf Qt und verwendet bereits QMediaPlayer / QVideoWidget zum Abspielen traditioneller Videos, aber der zusätzliche benutzerdefinierte Stream macht die Dinge komplizierter, da QMediaPlayer nur das Video / Audio QMediaPlayer und alles andere ignoriert.

Ich möchte vermeiden, das gesamte qt-multimedia neu zu erfinden, aber ich bin mir nicht sicher, wie ich das Beste aus den verfügbaren Qt-Klassen herausholen kann.

Meine bisherigen Ideen sind:

  1. Schreiben Sie eine benutzerdefinierte Media Player- Klasse, die das Video mit ffmpeg demuxiert und dekodiert, das Timing implementiert, QAudioOutput zum Abspielen der Audiodaten verwendet, einen QVideoFrame Stream für die QVideoFrame auf dem Video erzeugt und die benutzerdefinierten Daten in einen Puffer zur Visualisierung schreibt.

    Das Problem : Um zu vermeiden, den Code zum Neuskalieren / Konvertieren der Videoframes zu QVideoWidget , möchte ich QVideoWidget wiederverwenden, aber es scheint nur mit dem "echten" QMediaPlayer .

  2. Demux die Eingabedatei und füttern QMediaPlayer mit den AV-Streams. Demux die Eingabe mit ffmpeg (möglicherweise die Decodierung zum Qt-Backend zu QIODevice ), haben einen QIODevice , um nur die Video- / Audio-Streams aus der Eingabedatei abzurufen und einen anderen, um den Datenstrom abzurufen. Spielen Sie das Video / Audio mit dem QMediaPlayer .

                  +-------+                          
                  | QFile |                          
                  +---^---+                          
                      |                              
                   inherits                          
                      |                              
            +--------------------+
            |    MyAviDemuxer    |
            |                    |
            |  holds a queue of  |
            |  demuxed packets   |
            +--------------------+
            |                    |
      readDataPacket      readVideoPacket
            |                    |
    +-------v--------+  +--------v-----------+            +-----------+
    | MyCustomReader |  | MyVideoAudioStream +--inherits--> QIODevice |
    +----------------+  +--------+-----------+            +-----------+
                                 |       
                              setMedia                  
                                 |                  
                         +-------v-------+           
                         | QMediaPlayer  |           
                         +---------------+           
    

    Das Problem : Synchronisieren Sie das Timing des Datenstroms mit QMediaPlayer , behandeln Sie Header und Metadaten korrekt.

Ich bin etwas geneigt zu Option 1, nur weil es mir mehr Kontrolle gibt, aber ich frage mich, ob ich eine einfachere Lösung verpasst habe (sogar Windows-only).




Related