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

如何用FFmpeg将MP4转HLS并自动在主播放列表添加字幕?

如何让FFmpeg自动将字幕加入HLS主播放列表?

嘿,我明白你的困扰——手动修改m3u8确实麻烦,其实只要给FFmpeg加几个关键参数,就能自动生成带字幕关联的主播放列表了!

问题根源

你原来的命令虽然引入了VTT字幕文件,但没有明确告诉FFmpeg要将字幕流输出为独立的HLS字幕播放列表,也没有配置主播放列表中字幕的关联元信息,所以master.m3u8里只包含了视频流条目。

修正后的完整命令

直接用这个命令替换你原来的,就能自动生成符合需求的主播放列表:

../ffmpeg-4.2.1/ffmpeg -i ../input.mp4 -i ../subtitile.vtt \
  -c:v libx264 -profile:v baseline -level 21 -s 1280x720 \
  -c:a aac \
  -c:s webvtt \
  -start_number 0 -hls_time 10 -hls_list_size 3 \
  -hls_playlist_type vod \
  -master_pl_name master.m3u8 \
  -hls_flags independent_segments \
  -map 0:v -map 0:a -map 1:s \
  -metadata:s:s:0 language=hr \
  -metadata:s:s:0 title="Croatian" \
  -var_stream_map "v:0,a:0,s:0" \
  index_%v.m3u8

关键参数解释

我给你拆解几个核心参数的作用:

  • -map 0:v -map 0:a -map 1:s:明确指定要处理第一个输入的视频流、音频流,以及第二个输入的字幕流,确保FFmpeg不会忽略字幕。
  • -metadata:s:s:0 language=hr 和 -metadata:s:s:0 title="Croatian":给字幕流设置语言代码和显示名称,对应你手动添加的LANGUAGE="hr"和NAME="Croatian",播放器会识别这些信息。
  • -var_stream_map "v:0,a:0,s:0":这是最关键的参数!它告诉FFmpeg把视频、音频、字幕流绑定成一组,自动在主播放列表中生成EXT-X-MEDIA字幕条目,并且在视频流的EXT-X-STREAM-INF里加上SUBTITLES关联。
  • -hls_flags independent_segments:保证每个媒体片段都是独立可播放的,提升兼容性,避免VLC这类播放器出现识别问题。

执行效果

运行这个命令后,生成的master.m3u8会自动包含类似你手动修改的内容:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-MEDIA:TYPE=SUBTITLES,URI="index_0.m3u8",GROUP-ID="default-text-group",LANGUAGE="hr",NAME="Croatian",AUTOSELECT=YES
#EXT-X-STREAM-INF:BANDWIDTH=140800,RESOLUTION=1280x720,CODECS="avc1.42c015,mp4a.40.2",SUBTITLES="default-text-group"
index_0.m3u8

此时用VLC播放主播放列表,就能直接识别并加载字幕了,不需要再手动修改文件。

小提示

  • 你的FFmpeg 4.2.1版本完全支持这些参数,不用升级也能正常运行。
  • 确保输入的VTT字幕格式正确,比如没有语法错误,否则FFmpeg可能会忽略字幕流。

内容的提问来源于stack exchange,提问作者light01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:41:39