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

FFmpeg新手求助:批量转码MKV至MP4的参数设置、参数顺序及命令纠错

FFmpeg新手求助:批量转码MKV至MP4的参数设置、参数顺序及命令纠错

嗨,刚接触FFmpeg确实容易被参数顺序和各种选项搞晕,我来一步步帮你理清问题,纠正命令,再给你批量处理的方案~

首先先明确FFmpeg的参数顺序逻辑:它是按「全局选项 → 输入文件 → 输入专属选项 → 滤镜/流映射 → 输出选项 → 输出文件」的顺序解析的,顺序错了直接会导致命令失效或者结果不符合预期。比如你把输出选项放在输入文件前面,FFmpeg会误以为这是全局选项或者输入的设置,肯定会报错。

接下来针对你的每个需求,逐个拆解正确的实现方式,最后给出完整的命令:

核心需求对应的参数说明

  • H.264编码:用-c:v libx264,搭配-crf 22是非常合理的选择(CRF值越小画质越好,18-28是常用区间,22是画质体积平衡的黄金值)
  • MP4输出:直接把输出文件名设为xxx.mp4即可,MP4原生支持H.264视频和AAC音频
  • 指定音频轨:用-map 0:a:N,其中N是音频轨的索引(从0开始计数),比如你要选第2条音频轨就写-map 0:a:1(你原来的这个写法是对的,但要注意索引从0开始)
  • 指定字幕轨(嵌入/烧录):
    • 要是想把字幕嵌入MP4(可开关):用-map 0:s:N指定字幕轨,再加上-c:s mov_text(MP4支持的字幕格式)
    • 要是想烧录到视频里(不可开关):用subtitles滤镜,通过:si=N指定字幕轨索引,比如subtitles=input.mkv:si=1就是烧录第2条字幕
  • 添加黑边:用pad滤镜,你原来的pad=w=iw+112:h=ih+80:x=56:y=40:color=black是对的——iw是原视频宽度,iw+112就是左右各加56;ih是原视频高度,ih+80就是上下各加40,这样黑边是对称的

你的命令错误纠正

你写的命令有几个小问题:

  1. -vf:s:1是错误写法,-vf是视频滤镜的入口,不需要加:s:1,应该把字幕滤镜和pad滤镜放在同一个-vf里,用逗号分隔顺序执行
  2. 输出文件名前多了个-,应该直接写output.mp4
  3. 建议明确映射视频轨,避免FFmpeg自动选流出问题

正确的单文件命令

ffmpeg -i input.mkv \
  -c:v libx264 -crf 22 \
  -c:a aac -b:a 192k \
  -map 0:v:0 -map 0:a:1 \
  -vf "subtitles=input.mkv:si=1, pad=w=iw+112:h=ih+80:x=56:y=40:color=black" \
  output.mp4

逐参数解释:

  • -i input.mkv:指定输入的MKV文件
  • -c:v libx264 -crf 22:视频用H.264编码,CRF22保证画质和体积平衡
  • -c:a aac -b:a 192k:音频用AAC编码,192kbps是兼顾音质和体积的常用比特率
  • -map 0:v:0 -map 0:a:1:明确选择输入文件的第1条视频轨和第2条音频轨(索引从0开始)
  • -vf "...":视频滤镜链,先执行字幕烧录,再添加黑边(滤镜顺序很重要,先烧字幕再加黑边,字幕会在黑边内侧的视频区域)
  • output.mp4:最终输出的MP4文件

批量处理方案

如果要处理文件夹里所有MKV文件,不同系统的脚本如下:

Linux/macOS(Bash脚本)

把下面的代码保存为batch_convert.sh,放在MKV文件所在目录,给脚本加执行权限(chmod +x batch_convert.sh)后运行:

for file in *.mkv; do
  ffmpeg -i "$file" \
    -c:v libx264 -crf 22 \
    -c:a aac -b:a 192k \
    -map 0:v:0 -map 0:a:1 \
    -vf "subtitles=$file:si=1, pad=w=iw+112:h=ih+80:x=56:y=40:color=black" \
    "${file%.mkv}.mp4"
done

Windows(BAT脚本)

把下面的代码保存为batch_convert.bat,放在MKV文件所在目录双击运行:

@echo off
for %%f in (*.mkv) do (
  ffmpeg -i "%%f" ^
    -c:v libx264 -crf 22 ^
    -c:a aac -b:a 192k ^
    -map 0:v:0 -map 0:a:1 ^
    -vf "subtitles=%%f:si=1, pad=w=iw+112:h=ih+80:x=56:y=40:color=black" ^
    "%%~nf.mp4"
)

额外小技巧

如果不确定输入文件的音轨、字幕轨索引,可以先运行ffmpeg -i input.mkv查看流信息,比如:

Stream #0:0(eng): Video: h264 (High), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc
Stream #0:1(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 640 kb/s
Stream #0:2(chi): Subtitle: subrip

这里的字幕轨索引是2,所以烧录的时候要把si=1改成si=2。

备注:内容来源于stack exchange,提问作者emptylot4990

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 08:34:33