如何用FFmpeg从文件列表生成m3u8、转TS分片?video.js HLS支持选画质吗?
嘿,我来帮你搞定这两个FFmpeg和HLS相关的问题:
1. 用FFmpeg从一组文件列表生成m3u8文件
这里分两种常见场景,你可以根据自己的情况选择:
场景一:已有现成的媒体分片(比如TS文件),只想生成索引m3u8
这种情况不用转码,效率很高。先创建一个文本文件(比如file_list.txt),把所有分片按顺序列出来,每行格式是:file 'segment_01.ts' file 'segment_02.ts' file 'segment_03.ts'然后运行FFmpeg命令:
ffmpeg -f concat -safe 0 -i file_list.txt -c copy -hls_list_size 0 output.m3u8参数解释:
-f concat:告诉FFmpeg用concat demuxer来合并文件-safe 0:允许访问任意路径的文件(如果分片和列表不在同一目录的话很有用)-c copy:直接复制流,不做转码,节省时间-hls_list_size 0:让m3u8包含所有分片(默认只保留最近的几个,适合点播场景)
场景二:有一组完整媒体文件(比如多个MP4),想转码+切割成分片+生成m3u8
同样先做file_list.txt(格式同上),然后用转码命令:ffmpeg -f concat -safe 0 -i file_list.txt -c:v libx264 -c:a aac -hls_time 10 -hls_list_size 0 output.m3u8额外参数说明:
-c:v libx264和-c:a aac:HLS标准推荐的编码格式,确保在各种设备上都能播放-hls_time 10:设置每个TS分片的时长为10秒(可以根据需求调整)
2. 合并音视频字幕转TS分片+生成m3u8,以及Video.js的画质选择问题
合并音视频字幕生成HLS流
假设你的文件是video.mp4(视频)、audio.mp3(音频)、sub.srt(字幕),用下面的命令就能把它们整合到HLS流里,同时切成TS分片:
ffmpeg -i video.mp4 -i audio.mp3 -i sub.srt \ -c:v libx264 -preset medium -crf 23 \ -c:a aac -b:a 128k \ -c:s webvtt -metadata:s:s:0 language=eng \ -hls_time 10 -hls_list_size 0 \ -hls_flags independent_segments \ output.m3u8
参数拆解:
-preset medium -crf 23:平衡转码速度和画质的常用配置,CRF值越低画质越好(18-28是合理范围)-c:s webvtt:把SRT字幕转成HLS支持的WebVTT格式,-metadata用来标注字幕语言(方便播放器识别)-hls_flags independent_segments:确保每个TS分片都能独立播放,避免播放时出现卡顿
如果需要多画质的HLS流(方便用户切换),可以一次性生成不同分辨率/码率的变体,命令如下:
ffmpeg -i video.mp4 -i audio.mp3 \ # 1080p 流配置 -filter:v:0 scale=1920:1080 -c:v:0 libx264 -crf:0 23 -preset medium \ # 720p 流配置 -filter:v:1 scale=1280:720 -c:v:1 libx264 -crf:1 24 -preset medium \ # 480p 流配置 -filter:v:2 scale=854:480 -c:v:2 libx264 -crf:2 25 -preset medium \ # 统一音频编码 -c:a aac -b:a 128k \ # 映射音视频流到对应的变体 -map 0:v:0 -map 1:a:0 -map 0:v:1 -map 1:a:0 -map 0:v:2 -map 1:a:0 \ -f hls -hls_time 10 -hls_list_size 0 \ -hls_flags independent_segments \ # 指定主索引文件名 -master_pl_name master.m3u8 \ # 分片文件命名规则 -hls_segment_filename "hls/%v_%03d.ts" \ # 各变体的m3u8文件名 "hls/%v.m3u8"
运行后会生成master.m3u8(主索引文件,包含所有画质选项),以及每个画质对应的m3u8和TS分片。
Video.js HLS扩展的画质选择支持
完全支持! 只要你提供的是带多变体的主m3u8(就是上面生成的master.m3u8),Video.js会自动识别所有画质选项,并在播放器的控制栏里添加一个画质切换菜单,用户可以自由选择适合自己网络的分辨率/码率。
注意:如果是Video.js v7及以上版本,原生就支持HLS,不需要额外安装插件;旧版本可能需要引入videojs-contrib-hls插件才能正常工作。
内容的提问来源于stack exchange,提问作者Blurry Script
相关产品推荐
相关产品推荐

