如何使用FFmpeg将MKV转换为保留所有音轨和字幕的HLS并生成master.m3u8
如何使用FFmpeg将MKV转换为保留所有音轨和字幕的HLS并生成master.m3u8
嗨,我懂你想要的效果——把MKV转成HLS格式,还得完整保留原文件里的所有音轨和字幕,最后生成能统一管理这些流的master.m3u8。其实不用折腾Python/PHP脚本,FFmpeg本身就支持一步搞定,而且能自动帮你把所有流分组好。
核心FFmpeg命令
直接运行下面的命令就能实现你的需求:
ffmpeg -i input.mkv \ -c:v h264 -crf 23 -preset medium \ -c:a aac -b:a 192k \ -c:s webvtt \ -hls_time 10 \ -hls_list_size 0 \ -hls_flags independent_segments \ -master_pl_name master.m3u8 \ -map 0 \ output_%v.m3u8
参数详解(帮你理解为什么这么写)
-i input.mkv:指定你要转换的MKV输入文件-c:v h264 -crf 23 -preset medium:视频用H.264编码(HLS标准支持),crf 23是默认的质量参数(数值越小质量越高,18-28是常用范围),preset medium平衡转码速度和压缩效率-c:a aac -b:a 192k:音频转成AAC编码(HLS必选),192k比特率是兼顾音质和体积的常用值-c:s webvtt:把原MKV里的字幕转成WebVTT格式,这是HLS支持的字幕标准格式-hls_time 10:每个TS分片视频的时长设为10秒,你可以根据需求调整(比如5秒或15秒)-hls_list_size 0:保留所有生成的TS分片文件,不会自动删除旧的-hls_flags independent_segments:确保每个TS分片都能独立播放,提升在不同播放器上的兼容性-master_pl_name master.m3u8:指定生成的主播放列表文件名就是master.m3u8-map 0:关键参数——把输入MKV里的所有流(视频、所有音轨、所有字幕)都映射到输出,这样就能完整保留所有内容
执行后会生成什么?
运行命令后,FFmpeg会自动生成:
- 一系列TS视频分片文件(比如
output_0.ts、output_1.ts...) - 对应每个音轨的媒体播放列表(比如
output_0.m3u8对应视频+第一音轨,output_1.m3u8对应第二音轨,以此类推) - 每个字幕对应的WebVTT文件(比如
output_0.vtt)和对应的字幕播放列表 - 最终的
master.m3u8:这个主列表会把所有视频、音轨、字幕流按标准HLS格式分组,播放器可以直接读取它,让用户选择切换不同的音轨或字幕
额外小提示
如果你需要更精细的控制(比如只保留部分音轨/字幕),可以调整-map参数:
- 比如只想保留视频、所有音轨和前2个字幕:
-map 0:v -map 0:a -map 0:s:0 -map 0:s:1 - 排除某条音轨(比如第3条,索引从0开始):
-map 0 -map -0:a:2
测试的时候可以先用小体积的MKV文件试手,确认命令正常工作后再处理大文件。如果原MKV里的字幕是ASS/SRT格式,FFmpeg会自动转成WebVTT,不用额外处理。
备注:内容来源于stack exchange,提问作者Tutifruti
相关产品推荐
相关产品推荐

