使用 FFmpeg 创建 HLS 播放列表 (M3u8)

使用 FFmpeg 创建 HLS 播放列表 (M3u8)

我创建了自己的 bash 脚本,可以根据需要创建具有不同分辨率和比特率的视频。我使用“ffmpeg”工具来执行此操作,“ffmpeg”是必需的,因此我不能使用任何其他工具。

我的脚本的结果是:

在此处输入图片描述

每个文件夹都有:

在此处输入图片描述

默认视频和具有不同比特率的其他视频。

我想使用“ffmpeg”创建一个“HLS”播放列表。我发现一个网站展示了一个可以完成所有操作的脚本:

ffmpeg -i brooklynsfinest_clip_1080p.mp4 \
-filter_complex \
"[0:v]split=3[v1][v2][v3]; \
[v1]copy[v1out]; [v2]scale=w=1280:h=720[v2out]; [v3]scale=w=640:h=360[v3out]" \
-map [v1out] -c:v:0 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:0 5M -maxrate:v:0 5M -minrate:v:0 5M -bufsize:v:0 10M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
-map [v2out] -c:v:1 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:1 3M -maxrate:v:1 3M -minrate:v:1 3M -bufsize:v:1 3M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
-map [v3out] -c:v:2 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:2 1M -maxrate:v:2 1M -minrate:v:2 1M -bufsize:v:2 1M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
-map a:0 -c:a:0 aac -b:a:0 96k -ac 2 \
-map a:0 -c:a:1 aac -b:a:1 96k -ac 2 \
-map a:0 -c:a:2 aac -b:a:2 48k -ac 2 \
-f hls \
-hls_time 2 \
-hls_playlist_type vod \
-hls_flags independent_segments \
-hls_segment_type mpegts \
-hls_segment_filename stream_%v/data%02d.ts \
-master_pl_name master.m3u8 \
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" stream_%v.m3u8 

我更关注我无法弄清楚的最后一部分:

-f hls \
-hls_time 2 \
-hls_playlist_type vod \
-hls_flags independent_segments \
-hls_segment_type mpegts \
-hls_segment_filename stream_%v/data%02d.ts \
-master_pl_name master.m3u8 \
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" stream_%v.m3u8 

有人知道在我的情况下该怎么做吗?我只需要一个可以工作的 ffmpeg 命令,然后我就可以修改它并适应我的脚本。

我尝试这样做,但它给出了一个错误:

在此处输入图片描述

非常感谢您抽出时间!

答案1

的目的-var_stream_map是将媒体流分组在一起。在您的示例中,v:0,a:0表示视频流 1 和音频流 1 被分组在一起。

剩下要做的就是使用 命名流并更改段的目录-hls_segment_filename。为此,请更新-var_stream_map-hls_segment_filename选项,如下所示:

-var_stream_map "v:0,a:0,name:1080p v:1,a:1,name:720p v:2,a:2,name:360p"
-hls_segment_filename akiyo.mp4_%v_directory/data%02d.ts

在这些选项中,%v代表流名称和%02d段号。

相关内容