2015-06-03 14 views
10

Ich versuche zu leben Stream H.264 Inhalt zu HTML5 mit der Media-Source-Erweiterungen API.Live-Streaming-Dash-Inhalt mit mp4box

Die folgende Methode funktioniert recht gut:

ffmpeg -i rtsp://10.50.1.29/media/video1 -vcodec copy -f mp4 -reset_timestamps 1 -movflags frag_keyframe+empty_moov -loglevel quiet out.mp4

und dann: mp4box -dash 1000 -frag 1000 -frag-rap out.mp4

Ich kann nehmen Sie die MP4Box Ausgang (out_dashinit.mp4) und es durch Web Sockets, Chunk Chunk senden an einen JavaScript-Client, der sie an die Medienquellen-API übermittelt.

Dies ist jedoch keine gute Methode für Live-Inhalte.

Was ich jetzt versuche, ist, eine einzige Pipeline zu erstellen, um es in Echtzeit und mit der minimal möglichen Latenz zu tun. Mit FFmpeg ist es möglich, die Ausgabe auf stdout statt out.mp4 umzuleiten und den Inhalt zu greifen. Ich konnte nicht herausfinden, ob es möglich ist, MP4Box in die Pipeline zu kombinieren.

  1. Kann MP4Box die Eingabedaten von einer Quelle nehmen, die keine Datei ist?
  2. Kann MP4Box solch einen Inhalt progressiv aufnehmen (entweder von einer Datei oder einer anderen Quelle), während es in Echtzeit ankommt? d.h., warte ein wenig, wenn der Strom für 1 Sekunde stoppt und automatisch wieder aufgenommen wird.
  3. Gleiche Frage, aber für die Ausgabe: kann es auf etwas ausgeben, das keine Datei ist (wie stdout) und kann es so progressiv tun, dass, wenn Ausgabedaten bereit sind, ich es nehmen und es übertragen kann der Webclient, der im Wesentlichen ein nie endendes gestricheltes MP4 erzeugt.

Antwort

7

Sie brauchen nicht MP4Box die erforderliche Leistung zu erzeugen, aber Sie werden den Inhalt selbst suchen Boxen in der generierten Datei zu Chunk benötigen.

Grundsätzlich erhalten Sie eine fMP4 mit H264, erzeugen und an den Browser des moov Box für die Initialisierung und die moof+mdat Boxen für jedes Fragment von MP4 senden, die Sie erzeugen. Sie müssen den Player in JavaScript codieren, Sie werden wahrscheinlich keinen Standard-DASH-Player verwenden können.

Um das korrekte fragmentierte MP4 zu generieren, müssen Sie dieses an ffmpeg: -movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof übergeben.

Verwenden Sie unbedingt die neueste verfügbare Version.

+0

fantastisch. Es klappt! Haben Sie auch einen Vorschlag zur Reduzierung der Latenz? Ich habe derzeit etwa 3-4 Sekunden Latenz – galbarm

+1

Sie müssen mit den Parametern für x264 arbeiten.Der erste, den ich prüfen werde, ist die '-tune-Zero-latency', und arbeite mich von dort aus. –

+0

Aber ich transcodiere das Video nicht. Wie Sie sehen können, benutze ich -vcodec copy und ich weiß mit Sicherheit, dass das Video fast ohne Latenz ankommt. – galbarm

1

Soweit ich Ihre Lösung verstehe, streamen Sie nicht, sondern laden progressiv eine einzelne MP4-Datei herunter. Verstehe ich das richtig?

Ich habe vor kurzem das Projekt RTP2DASH gestartet, um echtes DASH Live-Streaming von einer RTP-Datenquelle zu machen. Es ist immer noch sehr "Alpha", aber es sollte leicht für einfache Anwendungsfälle übernommen werden können.

+0

Nein. Meine Lösung ist in der Tat Video-Streaming. Obwohl der Inhalt der Daten ein fragmentiertes mp4-Format ist, werden die Daten niemals in eine Datei geschrieben. – galbarm

+0

Ich habe das verstanden, aber es ist immer noch kein DASH, oder? Es gibt kein Manifest und keine Mehrfachqualitäten. Es wandelt einen RTSP-Stream in einen progressiven Download um. –

+0

Korrekt. Es ist keine adaptive Streaming-Lösung. Es ist eine niedrigstmögliche Latenz - eine einzige Qualitätslösung. – galbarm