So codieren Sie eine Eingabedatei in mehrere HLS-Streams mit FFmpeg, einschließlich der Master-Playlist

1734
林正浩

Hier ist das Szenario:

Ich muss eine einzelne Eingabedatei codieren, mit libx264 in mehrere HLS-Streams aufnehmen, und das Ziel ist es, auch die HLS-Master-Playlist mit demselben FFmpeg-Snippet zu generieren.

In der gleichnamigen Dokumentation von FFmpeg wird ein Szenario beschrieben, das mehrere Eingaben aufnimmt, beispielsweise MPEG-Transportströme, das Klassifizieren der Audio- und Videoströme darin und das Generieren mehrerer HLS-Ströme wie oben angegeben, wie hier gezeigt . Siehe die Dokumentation auf var_stream_mapderselben Seite.

Eine ähnliche Frage wurde bereits zuvor gestellt, der Fall des Benutzers beschreibt jedoch das von FFmpeg dokumentierte Szenario.

Alle Leads werden es tun, danke.

Nachverfolgen:

Ich habe einige Fortschritte bei der obigen Abfrage erzielt.

Man kann dieselbe Eingabe mehr als einmal einstellen, wodurch sowohl eine Neuzuordnung der Eingänge als auch eine erneute Kodierung im laufenden Betrieb ermöglicht wird, die dann mit dem h264_nvencKodierer in das HLS gemultiplext werden kann :

ffmpeg -loglevel debug -threads 4 -i /home/lin/Desktop/src/sowdtow.webm \ -i /home/lin/Desktop/src/sowdtow.webm \ -map '0:v' -c:v h264_nvenc -s 1920x1080 -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -b:v 3500k -maxrate:v 4250k -bufsize:v 8400k -map '0:a' -c:a aac -ab 128k \ -map '1:v' -c:v h264_nvenc -s 1280x720 -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -b:v 2800k -maxrate:v 2996k -bufsize:v 4200k -map '1:a' -c:a aac -ab 128k \ -f hls -var_stream_map "v:0,a:0 v:1,a:1" -hls_segment_filename 'vs%v/file_%03d.ts' -hls_time 5 -master_pl_name 'mainmanifest.m3u8' /home/lin/Desktop/dest/vs%v/manifest.m3u8 

Dieser Befehl hat jedoch die folgende Anomalie: Er gibt den letzten Stream (-map 1: v -map: 1: a) zweimal aus, wobei der erste und der zweite Stream vollständig ignoriert werden:

less mainmanifest.m3u8  #EXTM3U #EXT-X-VERSION:3 #EXT-X-STREAM-INF:BANDWIDTH=3220800,RESOLUTION=1280x720,CODECS="avc1.4d4029,mp4a.40.2" vs0/manifest.m3u8  #EXT-X-STREAM-INF:BANDWIDTH=3220800,RESOLUTION=1280x720,CODECS="avc1.4d4029,mp4a.40.2" vs1/manifest.m3u8 

Dies kann hilfreich sein, um das Problem auf ein Remap-Problem für den HLS-Muxer zu beschränken.

Erforscht immer noch. Das stinkt nach einem Syntaxfehler irgendwo im obigen Befehl. Wird aktualisiert, sobald ich eine Korrektur dafür habe.

Bearbeiten:

Es wurde durch einen Fehler in FFmpeg verursacht: https://trac.ffmpeg.org/ticket/7073, der nun behoben ist.

1
Hinweise: Lassen Sie diese Frage als offen markiert, falls jemand anderes auf ein solches Problem stößt. 林正浩 vor 6 Jahren 0

1 Antwort auf die Frage

0
林正浩

Anscheinend wurde die falsche EXTINF-Dauer, die in alternativen Streams beobachtet wurde, durch einen Fehler verursacht, siehe Patchwork hier .

Ein Beispiel-Snippet, das drei Varianten von HLS-Wiedergaben erzeugt, vorausgesetzt, der eingehende Videostrom hat eine Bildrate von 29,97 fps, und die Verwendung einer festen GOP-Größe über den NVENC-Codierer kann als solcher ausgeführt werden:

ffmpeg -loglevel debug -threads 4 -vsync 1 -i '/home/lin/Desktop/src/sowdtow.webm' \ -vf yadif -g 29.97 -r 29.97 \ -b:v:0 5250k -c:v h264_nvenc -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -strict_gop 1 -rc-lookahead 32 -no-scenecut 1 -forced-idr 1 -gpu 0 \ -b:v:1 4200k -c:v h264_nvenc -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -strict_gop 1 -rc-lookahead 32 -no-scenecut 1 -forced-idr 1 -gpu 1 \ -b:v:1 3150k -c:v h264_nvenc -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -strict_gop 1 -rc-lookahead 32 -no-scenecut 1 -forced-idr 1 -gpu 2 \ -b:a:0 256k \ -b:a:0 192k \ -b:a:0 128k \ -c:a aac -ar 48000 -map 0:v -map 0:a:0 -map 0:v -map 0:a:0 -map 0:v -map 0:a:0 \ -f hls -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" \ -master_pl_name master.m3u8 -t 300 -hls_time 10 -hls_init_time 4 -hls_list_size 10 -master_pl_publish_rate 10 -hls_flags delete_segments+discont_start+split_by_time \ "/home/lin/Desktop/dest/vs%v/manifest.m3u8" 

Markierung als gelöst