Wie generiere ich HLS-Inhalte mit mehreren Bitraten aus einem Live-Streaming-Stream?

12425
prashantas

Ich bastle Single Bitrate Live-Inhalte aus Live-RTSP-Stream. Ich verwende den folgenden Befehl

ffmpeg -v verbose -i rtsp://127.0.0.1:8080/test.sdp \ -vcodec libx264 -acodec 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 3 -hls_wrap 4 -hls_flags delete_segments \ -start_number 1 /usr/local/apache-tomcat-7.0.53/webapps/ROOT/hls/index1.m3u8 

Wie kann ich den obigen ffmpg-Befehl ändern, um Ausgabeinhalte mit mehreren Bitraten zu generieren? Bitte hilf mir.

5

2 Antworten auf die Frage

5
vayvanne
ffmpeg -v verbose -i rtsp://127.0.0.1:8080/test.sdp \ -vcodec libx264 -acodec 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 3 -hls_wrap 4 -hls_flags delete_segments \ -start_number 1 /usr/local/apache-tomcat-7.0.53/webapps/ROOT/hls/index1.m3u8 \ -vcodec libx264 -acodec aac -ac 1 -strict -2 -crf 18 \ -profile:v baseline -maxrate 700k -bufsize 1835k \ -pix_fmt yuv420p -flags -global_header \ -hls_time 10 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments \ -start_number 1 /usr/local/apache-tomcat-7.0.53/webapps/ROOT/hls/index2.m3u8 

und erstellen Sie index.m3u8, die auf die Streams oben zeigen:

#EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=400000 hls/index1.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=700000 hls/index2.m3u8 
Willkommen bei Super User. Können Sie Ihre Antwort erweitern, um zu erklären, was dieser Code bewirkt und wie er auf das Problem eingeht? Unerklärter Code ist [entmutigt] (http://meta.stackexchange.com/questions/148272), da er die Lösung nicht lehrt. Vielen Dank. fixer1234 vor 8 Jahren 0
Wir fügen die zweite Ausgabe mit den gleichen Parametern wie first -maxrate 700k hinzu und erstellen dann den Multi-Bitraten-Index m3u8 für beide HLS-Streams. vayvanne vor 8 Jahren 0
2
rainabba

Das Konzept, das Sie zum Erzeugen mehrerer Ausgaben aus einer einzigen Eingabe mit ffmpeg benötigen, wird auf https://trac.ffmpeg.org/wiki/Creating%20multiple%20outputs sehr deutlich gezeigt

Im Grunde ffmpeg -i someinput [output_options] someoutput1 [output2_options] someoutput2ist das Muster. Es scheint, dass Sie bereits wissen, wie Sie den RTSP als Eingabe verwenden, und wie Sie eine einzelne Ausgabe mit einer bestimmten Bitrate erzeugen. Sie müssen auch den gesamten Ausgabeblock (alles nach Ihrer RTSP-Eingabezeichenfolge) wiederholen und jedes Mal Ihre Auflösung mit -sund Ihre Bitrate ändern (Sie verwenden -crf, damit Sie sie für höhere Auflösung / höhere Qualität verringern und erhöhen möchten es für niedrigere Auflösung, geringere Qualität).

Ich persönlich würde crf für HLS-Wiedergaben verwenden, und mit libx265 ist die Regel, die ich verwende frame_width * frame_height * frame_rate * 0.1, die "ideale" Bitrate für eine gegebene Framegröße. Sie müssen die Gleichung umdrehen, wenn Sie Bitraten für das Ziel auswählen möchten und dann die Framegröße daraus ermitteln. Der ".1" -Wert kann höher liegen, aber Sie werden im Allgemeinen keinen großen Nutzen sehen (komplexere Inhalte verwenden besser einen höheren Wert) und ich gehe selten unter 0,07.