web-dev-qa-db-ja.com

マスタープレイリストを含むFFmpegを使用して1つの入力ファイルを複数のHLSストリームにエンコードする方法

シナリオは次のとおりです。

単一の入力ファイルをエンコードする必要があり、libx264を使用して複数のHLSストリームを想定します。目標は、同じFFmpegスニペットを使用してHLSマスタープレイリストも生成することです。

同じものに関するFFmpegのドキュメントから、MPEGトランスポートストリームなどの複数の入力を受け取り、その中のオーディオストリームとビデオストリームを分類し、次に示すように、上記のように複数のHLSストリームを生成するシナリオについて説明しています ここ =。同じページのvar_stream_mapのドキュメントを参照してください。

以前に同様の質問がありました ですが、ユーザーのケースはFFmpegによって文書化されたシナリオを説明しています。

どんなリードでもかまいません、ありがとう。

フォローアップ:

上記のクエリにいくらかの進歩を遂げました。

同じ入力を複数回設定できるため、入力の再マップとオンザフライでの再エンコードの両方が可能になり、h264_nvencエンコーダーを使用して以下に示すようにHLSに多重化できます。

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

ただし、このコマンドには次の異常があります。最初と2番目のストリームを完全に無視して、最後のストリーム(-map 1:v -map:1:a)を2回出力します。

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

これは、問題をHLSマルチプレクサの再マップの問題に絞り込むのに役立つ場合があります。

まだ調査中です。これは、上記のコマンドのどこかにある構文エラーの悪臭を放ちますが、修正があればすぐに更新されます。

編集:

FFmpegのバグが原因でした: https://trac.ffmpeg.org/ticket/707 これは修正されました。

1
林正浩

したがって、明らかに、代替ストリームで観察された間違ったEXTINF期間は、 修正された欠陥 によって引き起こされました。パッチワーク ここ を参照してください。

着信ビデオストリームのフレームレートが29.97fpsであり、NVENCエンコーダーを介して固定GOPサイズを使用すると仮定して、3つのバリアントHLSレンディションを生成するサンプルスニペットは、次のように実行できます。

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"

解決済みとしてマークします。

0
林正浩