Welcher Container für h.264 aac Livestream?

  • Hallo zusammen,

    bevor ich zu der Frage komme, vorab kurz mein Anwendungsfall: Ein vernünftiges externremux Skript für VDR Livestreaming mit niedrigerer Datenrate. Das bedeutet, ich will einen DVB-S Programm Datenstrom in Echtzeit zu einem Stream mit h264 Video und aac Audio Stream konvertieren, welcher letztendlich über HTTP zu einem Player gestreamt wird. Der Container ist mir letztendlich egal, es muss halt nur irgendwie in einer 'pipe' funktionieren.

    Nun zu meinen ernüchernden Ergebnissen.

    Ich habe folgende Container/Programm Kombinationen probiert:

    MPEG Transport Stream erstellt mit ffmpeg -f mpegts
    MPEG Program Stream erstellt mit ffmpeg -f mpeg
    MPEG Program Stream erstellt mit ffmpeg -f dvd
    MPEG Program Stream erstellt mit ffmpeg -f vob
    Matroska erstellt mit ffmpeg -f matroska
    Matroska erstellt mit mkvmerge
    MPEG 4 erstellt mit mp4creator
    MPEG 4 erstellt mit MP4Box

    Ich habe folgende Player auf die Streams (sofern sie sich überhaupt erzeugen liessen, dazu später mehr) losgelassen:

    MPlayer 1.0rc1
    MPlayer 1.10?
    VLC 0.8.6c
    VLC SVN
    Elecard Streameye (kein normaler Player sondern ein Analyse Tool)

    Mit keiner Kombination als Container/Programm und Player (ich habe quasi-systematisch alle durchgetestet) gibt es einen fehlerfrei abspielbaren Livestream.

    "ffmpeg -i ... -vcodec libx264 -acodec libfaac -f mpegts -" gibt das beste Ergebnis, und zwar den einzigen Stream, welchen die Playern überhaupt wiedergegeben können. Jedoch nur ruckelnd mit scheinbar falschen Timestamps (Lauftext springt vor und zurück).

    Dasselbe in die anderen MPEG Varianten gemuxt resultiert darin, dass VLC und MPlayer bei der Livewiedergabe keinen Anfang finden, beim Abspielen einer heruntergeladenen Streamkopie jedoch wunderbar lippensynchron arbeiten.

    Die anderen Erstell-Programme sind quasi durch die Bank nicht verwendbar, da sie entweder nicht in Pipes schreiben wollen oder nicht von Pipes lesen wollen oder sogar beides.

    Ehrlich gesagt bin ich ziemlich enttäuscht über ....

    Kann mir jemand den entscheidenden heissen Tipp geben? Ich kann die Dateien auch gerne mal uppen, dauert ein wenig.

  • Das es mit dem MP4 Container nicht klappt, liegt daran dass die moov Box erst erstellt werden kann, wenn alle dafür notwendigen Information für sie vorliegen - also wenn der Audio/Video Stream zu Ende ist. Manche Tools erstellen die moov Box auch am Ende der Datei. Zum Abspielen muss die Datei dann komplett heruntergeladen werden.
    Eine Alternative wären fragmentierte MP4 Dateien. Mir ist aber kein Tool bekannt was solche aus einer Pipe erstellt, hinzukommt das viele Player keine fragmentierten MP4 Dateien unterstützen. Neben Osmo4(GPAC) ist mir kein Player bekannt.

    Ich würde bei der Sache kein progressive download über http verwenden.
    Bei progressive download dürftest du bei längeren Filmen/Videos auch etwas Cachespeicher auf Client Seite benötigen.
    Ich würde rtsp bzw. rtp empfehlen. Schau dich mal bei VLC im Streaming HowTo in diese Richtung um. Bei Problemen würde ich dort im Forum fragen.

    Gruß
    Richard

  • Das es mit dem MP4 Container nicht klappt, liegt daran dass die moov Box erst erstellt werden kann, wenn alle dafür notwendigen Information für sie vorliegen - also wenn der Audio/Video Stream zu Ende ist. Manche Tools erstellen die moov Box auch am Ende der Datei. Zum Abspielen muss die Datei dann komplett heruntergeladen werden.

    Ich kenn mich im MPEG4 Umfeld nicht so aus, gibt es dort vergleichbares zu den MPEG2 Transport und Program Streams und wenn ja, auf welchen Typ von Container/Stream bezieht sich dein erster Satz?

    Welches Inhaltsfeld der moov Box erfordert die Kenntnis des gesamten Streams? Erlaubt der Standard die Platzierung am Dateianfang?

    Ich würde rtsp bzw. rtp empfehlen. Schau dich mal bei VLC im Streaming HowTo in diese Richtung um. Bei Problemen würde ich dort im Forum fragen.

    Bei einem Neuentwurf würde ich das berücksichtigen nur leider lässt sich das in dem vorliegenden Design nicht ohne grössere Umbauten bewerkstellen. So wie ich die FAQs und Dokumentationen der gängigen RTP Streaming Server interpretiere, haben die alle eine statische Input-Konfiguration (bspw: streame dies und das über Port xy), wobei bei mir das 'dies und das' durch den Aufruf parametrisiert wird (und ich nicht vorher statisch alle Permutionen vorkonfigurieren kann, da sich die Menge der verfügbaren Streams zur Laufzeit verändert, Stichwort Sendersuche).

    Am ehesten lässt sich eventuell noch der Feng/Felix Streaming Server verwenden, da er das Inputvideo live von einem Video4Linux Gerät bezieht und ich somit theoretisch 'nur' ein Input Modul schreiben müsste.

    Allerdings bin ich der Meinung, dass die gestellte Aufgabe unabhängig von RTP trotzdem mit einem MPEG2 TS zu lösen sein sollte, denn schliesslich bekommen die Fernsehstationen es auch irgendwie hin.

    Ich habe mittlererweile das Gefühl, dass das von mir beschriebene Wiedergabeproblem (ruckeln) von mpegts/(h264,aac) auf einen Fehler in den Playern zurückzuführen ist. Denn ich habe im Netz auch andere TS Dateien gefunden, welche dasselbe Muster zeigen und nach Remuxen (bspw zu mp4) vernünftig abgespielt werden können.

    Grüsse, Marcus

  • Ich kenn mich im MPEG4 Umfeld nicht so aus, gibt es dort vergleichbares zu den MPEG2 Transport und Program Streams und wenn ja, auf welchen Typ von Container/Stream bezieht sich dein erster Satz?


    Mein Satz bezieht sich wie geschrieben auf den MP4 Format(Container) [ISO/IEC 14496-14] bzw. ISO Base Media File Format[ISO/IEC 14496-12] wo die bekannte Box Struktur(früher Atom genannt) definiert ist.

    In MPEG-2 Transport Streams können soweit ich weiß auch MPEG-4 Visual und AVC/H.264 verwendet werden. Habe aber keine aktuelle Version von MPEG-2 Systems [ISO/IEC 13818-1] und kenne mich da auch nicht aus.


    Welches Inhaltsfeld der moov Box erfordert die Kenntnis des gesamten Streams? Erlaubt der Standard die Platzierung am Dateianfang?


    Unter der stbl box(Sample Table Box) ist ein Art Index, der sich nur erstellen lässt wenn die entsprechenden Audio und Video Frames bekannt sind.
    ...

    Wenn du mehr über das ISO Base Media File Format[ISO/IEC 14496-12] wissen willst benutze mal https://localhost/www.google.de , der Standard ist frei erhältlich.

    Die moov Box ist am Anfang und Ende der Datei erlaubt.

    [EDIT]Ich würde aber auch bei einem MPEG-2 Transport Stream eher rtp als http verwenden[/EDIT]

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!