MP4 和字幕怎么封装成 MKV,用 FFmpeg 最省事
MP4 和字幕怎么封装成 MKV,用 FFmpeg 最省事
有时候你手里已经有现成的 MP4 视频和 SRT 或 ASS 字幕,需求并不是“压制”,而只是:
- 把字幕封进视频文件里
- 生成一个新的
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 | input.mp4 |
执行:
1 | ffmpeg -i input.mp4 -i subtitle.srt -c copy output.mkv |
输出结果就是:
1 | output.mkv |
生成后的字幕是内封字幕,不会烧录到画面里,播放器里可以开关。
给字幕设置语言和名称
如果你希望播放器里能直接看到“中文字幕”这种标识,可以顺手把语言和标题一起写进去:
1 | ffmpeg -i input.mp4 -i subtitle.srt \ |
这个命令做了两件事:
- 给第一个字幕流设置语言为
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 | ffmpeg -i input.mp4 -i zh.srt -i en.srt \ |
这样生成后的 MKV 会带两个可切换字幕轨。
这个场景很适合:
- 收藏片源
- 自用学习资料
- 需要中英切换的课程视频
不想用命令行,也可以用 MKVToolNix
如果你不想敲命令,可以直接上图形界面工具:MKVToolNix GUI。
流程很简单:
- 打开
MKVToolNix GUI - 把
input.mp4拖进去 - 再把
subtitle.srt或subtitle.ass拖进去 - 设置输出文件名,比如
output.mkv - 点击“开始混流”
本质上它做的也是封装,不是重新压缩视频。
所以它的优点和命令行方案一样:
- 快
- 省资源
- 不会因为重编码导致画质再损一次
如果你想用 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 | mkvmerge -o output.mkv \ |
这里要注意一件事:
mkvmerge 这类参数是作用在后面那个输入文件上的。
上面这条命令里的 --language 0:zh-CN 和 --track-name 0:"中文字幕",设置的是 subtitle.srt 里的第 0 条轨道。
一次封多个字幕
如果你有中英双字幕,可以这样写:
1 | mkvmerge -o output.mkv \ |
这样生成后的 MKV 会同时带两条字幕轨。
设置默认字幕轨
如果你想让其中一条字幕默认开启,可以顺手加上默认轨道标记:
1 | mkvmerge -o output.mkv \ |
这条命令表示:
- 中文字幕默认开启
- 英文字幕保留,但不作为默认字幕
只保留视频和音频,再额外加字幕
如果你担心源文件里已经带了别的字幕,也可以在输入 MP4 时先明确不要旧字幕:
1 | mkvmerge -o output.mkv \ |
这样更适合下面这种情况:
- 原视频里已经有你不想保留的字幕轨
- 你只想保留视频、音频,再换成自己的字幕文件
FFmpeg 和 mkvmerge 怎么选
如果你的目标只是“把 MP4 和字幕快速封成 MKV”,那 FFmpeg 和 mkvmerge 都能做。
区别可以直接这么理解:
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”的日常需求了。




