You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:09:50