MP4 和字幕怎么封装成 MKV,用 FFmpeg 最省事

有时候你手里已经有现成的 MP4 视频和 SRTASS 字幕,需求并不是“压制”,而只是:

  • 把字幕封进视频文件里
  • 生成一个新的 MKV
  • 播放器里可以自由开关字幕
  • 不重新编码,尽量快

这种场景最省事的做法,不是重新导出视频,而是直接做一次封装(remux)

这篇只讲最短路径。

先说结论

如果你只是想把一个 MP4 和一个字幕文件封装成新的 MKV,最常用的命令就是:

1
ffmpeg -i input.mp4 -i subtitle.srt -c copy output.mkv

这条命令的关键在 -c copy

  • 不重新编码视频
  • 不重新编码音频
  • 只是把原有流重新装进 MKV 容器
  • 速度通常很快

一句话理解:

这不是“转码”,而是“换盒子顺手把字幕塞进去”。

为什么更推荐封装成 MKV

虽然 MP4 也能处理一部分字幕场景,但如果你要的是更稳妥的字幕兼容性,MKV 通常更省心。

原因很直接:

  • MKV 对字幕格式支持更宽松
  • 内封字幕管理更方便
  • 做多字幕时更顺手
  • 很多播放器对 MKV + SRT/ASS 的支持更成熟

如果目标是“本地播放好用、字幕可切换、少折腾”,那 MKV 往往比继续留在 MP4 更合适。

你的输入文件长这样

假设当前目录里有这两个文件:

1
2
input.mp4
subtitle.srt

执行:

1
ffmpeg -i input.mp4 -i subtitle.srt -c copy output.mkv

输出结果就是:

1
output.mkv

生成后的字幕是内封字幕,不会烧录到画面里,播放器里可以开关。

给字幕设置语言和名称

如果你希望播放器里能直接看到“中文字幕”这种标识,可以顺手把语言和标题一起写进去:

1
2
3
4
5
ffmpeg -i input.mp4 -i subtitle.srt \
-c copy \
-metadata:s:s:0 language=chi \
-metadata:s:s:0 title="中文字幕" \
output.mkv

这个命令做了两件事:

  • 给第一个字幕流设置语言为 chi
  • 给它设置一个显示名称 中文字幕

如果你在 Windows PowerShell 里用,一行写法更省事:

1
ffmpeg -i input.mp4 -i subtitle.srt -c copy -metadata:s:s:0 language=chi -metadata:s:s:0 title="中文字幕" output.mkv

ASS 字幕也可以直接封装

如果你的字幕不是 SRT,而是 ASS,也可以直接封进去:

1
ffmpeg -i input.mp4 -i subtitle.ass -c copy output.mkv

这也是很多人更偏向 MKV 的原因之一:

它对字幕格式的兼容度通常比 MP4 场景更省心。

一次封多个字幕

如果你手里有中英双字幕,或者多个语言版本,也可以一次封进去:

1
2
3
4
5
ffmpeg -i input.mp4 -i zh.srt -i en.srt \
-c copy \
-metadata:s:s:0 language=chi -metadata:s:s:0 title="中文" \
-metadata:s:s:1 language=eng -metadata:s:s:1 title="English" \
output.mkv

这样生成后的 MKV 会带两个可切换字幕轨。

这个场景很适合:

  • 收藏片源
  • 自用学习资料
  • 需要中英切换的课程视频

不想用命令行,也可以用 MKVToolNix

如果你不想敲命令,可以直接上图形界面工具:MKVToolNix GUI

流程很简单:

  1. 打开 MKVToolNix GUI
  2. input.mp4 拖进去
  3. 再把 subtitle.srtsubtitle.ass 拖进去
  4. 设置输出文件名,比如 output.mkv
  5. 点击“开始混流”

本质上它做的也是封装,不是重新压缩视频。

所以它的优点和命令行方案一样:

  • 省资源
  • 不会因为重编码导致画质再损一次

如果你想用 MKVToolNix 的命令行版本

如果你不是想点 GUI,而是想直接写脚本或批处理,那你真正要用的命令其实是:

mkvmerge

它是 MKVToolNix 里最常用的命令行工具,作用就是把视频、音频、字幕这些轨道重新封装进 MKV

最简单的版本是:

1
mkvmerge -o output.mkv input.mp4 subtitle.srt

这条命令对应的其实就是前面 GUI 里“拖两个文件进去再开始混流”的命令行版本。

先看轨道信息

如果你后面要设置语言、轨道名、默认字幕,最好先看一下源文件轨道信息:

1
mkvmerge -i input.mp4

如果你也想看字幕文件本身能不能被识别,也可以看:

1
mkvmerge -i subtitle.srt

这一步的目的很简单:

  • 确认文件能被识别
  • 看看轨道 ID
  • 后面设置参数时不至于搞混

单字幕封装

把一个 MP4 和一个 SRT 封成 MKV

1
mkvmerge -o output.mkv input.mp4 subtitle.srt

如果字幕是 ASS,也是一样:

1
mkvmerge -o output.mkv input.mp4 subtitle.ass

给字幕设置语言和轨道名

如果你希望播放器里直接显示“中文字幕”,可以这样写:

1
2
3
4
5
mkvmerge -o output.mkv \
input.mp4 \
--language 0:zh-CN \
--track-name 0:"中文字幕" \
subtitle.srt

这里要注意一件事:

mkvmerge 这类参数是作用在后面那个输入文件上的
上面这条命令里的 --language 0:zh-CN--track-name 0:"中文字幕",设置的是 subtitle.srt 里的第 0 条轨道。

一次封多个字幕

如果你有中英双字幕,可以这样写:

1
2
3
4
mkvmerge -o output.mkv \
input.mp4 \
--language 0:zh-CN --track-name 0:"中文" zh.srt \
--language 0:en --track-name 0:"English" en.srt

这样生成后的 MKV 会同时带两条字幕轨。

设置默认字幕轨

如果你想让其中一条字幕默认开启,可以顺手加上默认轨道标记:

1
2
3
4
mkvmerge -o output.mkv \
input.mp4 \
--language 0:zh-CN --track-name 0:"中文" --default-track-flag 0:1 zh.srt \
--language 0:en --track-name 0:"English" --default-track-flag 0:0 en.srt

这条命令表示:

  • 中文字幕默认开启
  • 英文字幕保留,但不作为默认字幕

只保留视频和音频,再额外加字幕

如果你担心源文件里已经带了别的字幕,也可以在输入 MP4 时先明确不要旧字幕:

1
2
3
mkvmerge -o output.mkv \
--no-subtitles input.mp4 \
--language 0:zh-CN --track-name 0:"中文字幕" subtitle.srt

这样更适合下面这种情况:

  • 原视频里已经有你不想保留的字幕轨
  • 你只想保留视频、音频,再换成自己的字幕文件

FFmpeg 和 mkvmerge 怎么选

如果你的目标只是“把 MP4 和字幕快速封成 MKV”,那 FFmpegmkvmerge 都能做。

区别可以直接这么理解:

  • FFmpeg 更通用,顺手,很多机器本来就有
  • mkvmerge 更偏 Matroska / MKV 专项工具
  • 如果你后面会频繁处理轨道名、默认轨、语言标记,mkvmerge 往往更顺手
  • 如果你还会顺便做转码、抽流、裁剪,那 FFmpeg 通常更统一

如果你只想记最省事的判断:

  • 日常混流,先用 FFmpeg
  • 专门折腾 MKV 轨道细节,用 mkvmerge

安装 FFmpeg

如果你本机还没装 FFmpeg,可以直接用这些命令。

Windows:

1
winget install Gyan.FFmpeg

macOS:

1
brew install ffmpeg

Arch Linux:

1
sudo pacman -S ffmpeg

装完以后先跑一下:

1
ffmpeg -version

能看到版本号,说明环境已经可用了。

常见问题

1. 这会不会重新编码,很慢?

正常不会。

只要你用了:

1
-c copy

FFmpeg 做的就是流拷贝加重新封装,不会把视频重新压一遍。

所以它通常比“导出一个新视频”快得多。

2. 这是内嵌字幕还是硬字幕?

这是内封字幕,不是硬字幕。

区别很大:

  • 内封字幕:播放器里可开关
  • 硬字幕:字幕直接烙进画面,关不掉

上面这篇命令讲的都是内封方案。

3. 为什么不直接继续用 MP4?

不是不能用,而是没必要给自己增加兼容性负担。

如果你的目标就是“把字幕一起打包进去,播放器里还能切换”,那 MKV 一般更稳。

4. 中文字幕显示乱码怎么办?

最常见的问题不是 FFmpeg,而是字幕文件编码本身不对。

优先检查:

  • subtitle.srt 是否是 UTF-8
  • 字幕内容本身有没有异常字符

如果字幕文件编码有问题,先转成 UTF-8 再封装,通常更稳。

最后给你一个最短命令版

如果你只想记住一条命令,就记这个:

1
ffmpeg -i input.mp4 -i subtitle.srt -c copy output.mkv

如果你还想让播放器里把字幕显示成“中文字幕”,就用这个:

1
ffmpeg -i input.mp4 -i subtitle.srt -c copy -metadata:s:s:0 language=chi -metadata:s:s:0 title="中文字幕" output.mkv

这两条,已经够覆盖大多数“MP4 + 字幕生成 MKV”的日常需求了。