be七365

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

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

MP4 和字幕怎么封装成 MKV,用 FFmpeg 最省事有时候你手里已经有现成的 MP4 视频和 SRT 或 ASS 字幕,需求并不是“压制”,而只是:

把字幕封进视频文件里

生成一个新的 MKV

播放器里可以自由开关字幕

不重新编码,尽量快

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

这篇只讲最短路径。

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

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

这条命令的关键在 -c copy:

不重新编码视频

不重新编码音频

只是把原有流重新装进 MKV 容器

速度通常很快

一句话理解:

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

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

原因很直接:

MKV 对字幕格式支持更宽松

内封字幕管理更方便

做多字幕时更顺手

很多播放器对 MKV + SRT/ASS 的支持更成熟

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

你的输入文件长这样假设当前目录里有这两个文件:

12input.mp4subtitle.srt

执行:

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

输出结果就是:

1output.mkv

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

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

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

这个命令做了两件事:

给第一个字幕流设置语言为 chi

给它设置一个显示名称 中文字幕

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

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

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

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

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

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

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

12345ffmpeg -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。

流程很简单:

打开 MKVToolNix GUI

把 input.mp4 拖进去

再把 subtitle.srt 或 subtitle.ass 拖进去

设置输出文件名,比如 output.mkv

点击“开始混流”

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

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

快

省资源

不会因为重编码导致画质再损一次

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

mkvmerge

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

最简单的版本是:

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

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

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

1mkvmerge -i input.mp4

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

1mkvmerge -i subtitle.srt

这一步的目的很简单:

确认文件能被识别

看看轨道 ID

后面设置参数时不至于搞混

单字幕封装把一个 MP4 和一个 SRT 封成 MKV:

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

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

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

给字幕设置语言和轨道名如果你希望播放器里直接显示“中文字幕”,可以这样写:

12345mkvmerge -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 条轨道。

一次封多个字幕如果你有中英双字幕,可以这样写:

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

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

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

1234mkvmerge -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 时先明确不要旧字幕:

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

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

原视频里已经有你不想保留的字幕轨

你只想保留视频、音频,再换成自己的字幕文件

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

区别可以直接这么理解:

FFmpeg 更通用,顺手,很多机器本来就有

mkvmerge 更偏 Matroska / MKV 专项工具

如果你后面会频繁处理轨道名、默认轨、语言标记,mkvmerge 往往更顺手

如果你还会顺便做转码、抽流、裁剪,那 FFmpeg 通常更统一

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

日常混流,先用 FFmpeg

专门折腾 MKV 轨道细节,用 mkvmerge

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

Windows:

1winget install Gyan.FFmpeg

macOS:

1brew install ffmpeg

Arch Linux:

1sudo pacman -S ffmpeg

装完以后先跑一下:

1ffmpeg -version

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

常见问题1. 这会不会重新编码,很慢?正常不会。

只要你用了:

1-c copy

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

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

2. 这是内嵌字幕还是硬字幕?这是内封字幕,不是硬字幕。

区别很大:

内封字幕:播放器里可开关

硬字幕:字幕直接烙进画面,关不掉

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

3. 为什么不直接继续用 MP4?不是不能用,而是没必要给自己增加兼容性负担。

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

4. 中文字幕显示乱码怎么办?最常见的问题不是 FFmpeg,而是字幕文件编码本身不对。

优先检查:

subtitle.srt 是否是 UTF-8

字幕内容本身有没有异常字符

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

最后给你一个最短命令版如果你只想记住一条命令,就记这个:

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

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

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

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

相关推荐