web-dev-qa-db-de.com

Wie können wir Live-RTMP-Streams mit ffmpeg in Live-HLS-Streams umcodieren?

Ich versuche, einen Live-RTMP-Stream in hls-Stream in Echtzeit zu konvertieren.

Ich habe eine Idee nach dem Lesen

http://sonnati.wordpress.com/2011/08/30/ffmpeg-%E2%80%93-the-swiss-army-knife-of-internet-streaming-%E2%80%93- Teil-IV /

ich bin in der Lage, den Live-RTMP-Stream in hls zu konvertieren, aber nicht zur Laufzeit. Wenn ich den Befehl ausführe und auf irgendwelche hsl-Dateien teste (.m3u8 und .ts), kann ich nicht sehen, aber wenn ich den Befehl unterbreche und dort überprüfe, erhalte ich die hls-Dateien wie erforderlich.

Ich suchte auf Google nach einer Lösung, konnte aber keine richtige Antwort erhalten.

Kann mir jemand helfen?

Danke im Voraus...

34
Kiran

Dies ist eine Kurzanleitung für HLS-Streaming mit jeder Eingabedatei oder jedem Stream:

Ich verfolge den Ansatz von user1390208, daher verwende ich FFMPEG nur, um den RTMP-Stream zu erzeugen, den mein Server dann empfängt, um HLS bereitzustellen. Anstelle von Unreal/Wowza/Adobe verwende ich den kostenlosen Server nginx mit dem rtmp-Modul, das recht einfach einzurichten ist. So mache ich das kurz: Any input file or stream -> ffmpeg -> rtmp -> nginx server -> HLS -> Client Oder genauer:

eingabe einer Videodatei oder eines Streams (http, rtmp, was auch immer) -> ffmpeg transkodiert live auf x.264 + aac, gibt auf rtmp aus -> nginx nimmt das rtmp und stellt dem Benutzer (Client) ein HLS zur Verfügung. Auf der Clientseite können Sie also VLC oder was auch immer verwenden und eine Verbindung mit der .m3u8-Datei herstellen, die von nginx bereitgestellt wird.

  • Ich folgte this Setup-Anleitung für Nginx.
  • This ist meine Nginx-Konfigurationsdatei.
  • So verwende ich ffmpeg, um meine Eingabedatei in rtmp umzucodieren:

    ffmpeg -re -i mydirectory/myfile.mkv -c:v libx264 -b:v 5M -pix_fmt yuv420p -c:a:0 libfdk_aac -b:a:0 480k -f flv rtmp://localhost:12345/hls/mystream;
    

    (die .mkv ist 1080p mit 5.1 sound, je nach eingang solltest du niedrigere bitraten verwenden!)

Woher bekommst du den rtmp-Stream?

  • Eine Datei? Dann können Sie genau meinen Ansatz verwenden.
  • Jeder Server X mit einem Stream Y? Dann müssen Sie den Befehl ffmpeg wie folgt ändern:

    ffmpeg -re -i rtmp://theServerX/yourStreamY -c:v libx264 -b:v 5M -pix_fmt yuv420p -c:a:0 libfdk_aac -b:a:0 480k -f flv rtmp://localhost:12345/hls/mystream;
    

    wenn Ihr RTMP-Stream bereits mit H.264/AAC codiert ist, können Sie versuchen, die Option copy in ffmpeg zu verwenden, um den Inhalt direkt an nginx zu streamen.

Wie Sie in meiner Nginx-Konfigurationsdatei sehen:

  • Mein RTMP-Server hat eine "Anwendung" namens "hls". Dies ist der Teil, der beschreibt, wo nginx den rtmp-Stream von ffmpeg abhört, und deshalb streamt ffmpeg auf rtmp://localhost:12345/hls/mystream;
  • Mein http-Server hat den location /hls. Dies bedeutet, dass ich in VLC eine Verbindung zu http://myServer:80/hls/mystream.m3u8 Herstellen kann, um auf den HLS-Stream zuzugreifen.

Ist alles klar Viel Spaß beim Streamen!

70
user3069376

Probieren Sie diese RTMP-zu-HLS-Befehlszeileneinstellungen aus:

ffmpeg -v verbose -i rtmp://<Host>:<port>/<stream> -c:v libx264 -c:a aac -ac 1 -strict -2 -crf 18 -profile:v baseline -maxrate 400k -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -start_number 1 <pathToFolderYouWantTo>/<streamName>.m3u8

Es kann zu Verzögerungen im HLS-Feed kommen. Es wird jedoch funktionieren.

21
Sumoanand

Als Update zu dieser Frage habe ich es geschafft, die Live-Transcodierung von RTMP zu HLS ohne die Verwendung von ffmpeg abzuschließen. Wie?

Wenn Sie genau die gleiche Nginx-Konfigurationsdatei verwenden, die von user3069376 gemeinsam genutzt wird, und die Pfade, unter denen Sie das .m3uh-Manifest generieren, sehr sorgfältig prüfen, sollte dies mit der Option hls im RTMP-Modul erledigt werden.

Was den Videoplayer angeht, wirkten die Video.Js wie ein Zauber

2
chinchillaboy