使用 FFmpeg 生成 .m3u8
文件(HLS 格式)的方法比较简单,基本上可以通过以下步骤来完成:
基本命令
假设你已经安装了 FFmpeg,并且有一个视频文件(如 input.mp4
),你可以通过以下命令来生成 .m3u8
文件和分片的 .ts
文件:
ffmpeg -i input.mp4 -preset fast -g 60 -sc_threshold 0 -f hls -hls_time 10 -hls_list_size 0 -hls_segment_filename "output_%03d.ts" output.m3u8
参数说明:
-i input.mp4
:输入的视频文件。
-preset fast
:编码器预设,可以选择不同的编码速度(fast
、medium
、slow
)。fast
更快,但可能会牺牲一些压缩效率。
-g 60
:指定每隔多少帧插入一个关键帧。通常,HLS 需要在每个分片的开始处有一个关键帧,常见的设置为视频帧率的两倍,或者根据需要调整。
-sc_threshold 0
:这表示关闭场景切换检测。若不想自动切换,设为 0
。
-f hls
:指定输出格式为 HLS。
-hls_time 10
:每个分片的时长,单位是秒。这里是 10 秒一个分片。
-hls_list_size 0
:表示 .m3u8
列表不限制包含的段数,通常设为 0
表示没有限制。
-hls_segment_filename "output_%03d.ts"
:分片文件的命名规则。%03d
会为每个文件生成一个递增的数字,例如 output_001.ts
、output_002.ts
等。
output.m3u8
:生成的主 M3U8 文件的名称。
示例命令解读:
input.mp4
:输入的视频文件。
output_%03d.ts
:分片文件名模板。
output.m3u8
:最终的 M3U8 播放列表文件。
高级选项:
如果你想生成多个不同的质量级别的 M3U8(例如用于自适应流),可以使用 FFmpeg 的 -map
参数和不同的编码参数生成多个输出流。例如:
ffmpeg -i input.mp4 \
-map 0:v:0 -map 0:a:0 -b:v:0 1000k -c:v:0 libx264 -preset fast -g 60 -sc_threshold 0 -f hls -hls_time 10 -hls_list_size 0 -hls_segment_filename "low_%03d.ts" low.m3u8 \
-map 0:v:0 -map 0:a:0 -b:v:0 2000k -c:v:0 libx264 -preset fast -g 60 -sc_threshold 0 -f hls -hls_time 10 -hls_list_size 0 -hls_segment_filename "mid_%03d.ts" mid.m3u8 \
-map 0:v:0 -map 0:a:0 -b:v:0 5000k -c:v:0 libx264 -preset fast -g 60 -sc_threshold 0 -f hls -hls_time 10 -hls_list_size 0 -hls_segment_filename "high_%03d.ts" high.m3u8
这样你就会生成多个 .m3u8
文件,每个文件对应不同的质量等级(低、中、高),并且可以在播放时根据网络带宽自动选择最适合的流。
总结:
使用 FFmpeg 生成 .m3u8
文件的过程通常包括:
- 设置输入文件和视频编码参数。
- 设置输出文件格式为 HLS。
- 使用
-hls_time
和 -hls_segment_filename
来控制分片大小和分片文件命名。
- 使用
.m3u8
文件作为主播放列表。
如果你有特定需求,比如自适应流,或者调整分片大小、编码参数等,也可以根据需要修改命令。