主要使用两种工具:ffmpeg和mkvmerge
操作系统:windows10及以上
ffmpeg下载:
https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl-shared.zip
mkvmerge下载:
https://mkvtoolnix.download/windows/releases/89.0/mkvtoolnix-64-bit-89.0.7z
本人习惯使用压缩包来安装,只需要解压,然后手动配置环境变量就好了。
安装以后,查看是否安装成功:
PS C:\Users\yyjeqhc> ffmpeg -version
ffmpeg version N-118425-g33679f5325-20250205 Copyright (c) 2000-2025 the FFmpeg developers
built with gcc 14.2.0 (crosstool-NG 1.26.0.120_4d36f27)PS C:\Users\yyjeqhc> mkvmerge --version
mkvmerge v89.0 ('And the Melody Still Lingers On (Night in Tunisia)') 64-bit
这样的话,两种软件就算配置好了
在正式进行合并mkv视频和ass字幕文件之前,先看一下视频元信息:
使用ffmpeg配套的ffprobe,和ffmpeg在同级目录
ffprobe 1.mkv
...忽略一些信息,只看最后的Stream就好了。
Stream #0:0: Video: hevc (Main 10), yuv420p10le(tv, bt709/unknown/unknown), 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn (default)Metadata:BPS : 2789959BPS-eng : 2789959DURATION : 00:24:06.028000000DURATION-eng : 00:24:06.028000000NUMBER_OF_FRAMES: 34670NUMBER_OF_FRAMES-eng: 34670NUMBER_OF_BYTES : 504295001NUMBER_OF_BYTES-eng: 504295001_STATISTICS_WRITING_APP: mkvmerge v10.0.0 ('To Drown In You') 64bit_STATISTICS_WRITING_APP-eng: mkvmerge v10.0.0 ('To Drown In You') 64bit_STATISTICS_WRITING_DATE_UTC: 2019-08-06 18:43:13_STATISTICS_WRITING_DATE_UTC-eng: 2019-08-06 18:43:13_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTESStream #0:1(jpn): Audio: flac, 48000 Hz, stereo, s16 (default)Metadata:BPS : 661042BPS-eng : 661042DURATION : 00:24:06.030000000DURATION-eng : 00:24:06.030000000NUMBER_OF_FRAMES: 16946NUMBER_OF_FRAMES-eng: 16946NUMBER_OF_BYTES : 119485830NUMBER_OF_BYTES-eng: 119485830_STATISTICS_WRITING_APP: mkvmerge v10.0.0 ('To Drown In You') 64bit_STATISTICS_WRITING_APP-eng: mkvmerge v10.0.0 ('To Drown In You') 64bit_STATISTICS_WRITING_DATE_UTC: 2019-08-06 18:43:13_STATISTICS_WRITING_DATE_UTC-eng: 2019-08-06 18:43:13_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
使用mkvmerge(简略)或配套的mkvinfo(详细):
mkvmerge -i 1.mkv
文件 「1.mkv」: 容器: Matroska
轨道 ID 0: video (HEVC/H.265/MPEG-H)
轨道 ID 1: audio (FLAC)
章节: 4 个条目
mkvinfo 1.mkv
+ EBML 头
|+ EBML 版本: 1
|+ EBML 读取版本: 1
|+ EBML ID 最大长度: 4
|+ EBML 大小最大长度: 8
|+ 文档类型: matroska
|+ 文档类型版本: 4
|+ 文档类型读取版本: 2
+ 剪辑: 大小 624103784
|+ 定位头 (子条目将被跳过)
|+ EBML void: 大小 4012
|+ 剪辑信息
| + 时间戳缩放: 1000000
| + 混流应用程序: libebml v1.3.4 + libmatroska v1.4.5
| + 写入应用程序: mkvmerge v10.0.0 ('To Drown In You') 64bit
| + 时长: 00:24:06.030000000
| + 日期: 2019-08-06 18:43:13 UTC
| + 剪辑 UID: 0xa5 0xbc 0x7d 0xd5 0x7f 0x89 0x1f 0xe7 0xb3 0x72 0x90 0xf0 0xbd 0x24 0x64 0x94
|+ 轨道
| + 轨道
| + 轨道编号: 1 (mkvmerge & mkvextract 的轨道 ID: 0)
| + 轨道 UID: 9573046348824528283
| + 轨道类型: 视频
| + 「紧缩」 标记: 0
| + 最小缓存: 1
| + 编码格式 ID: V_MPEGH/ISO/HEVC
| + 语言: und
| + 视频轨道
| + 像素宽度: 1920
| + 像素高度: 1080
| + 显示宽度: 1920
| + 显示高度: 1080
| + 编解码器私有数据: 大小 2203 (HEVC 档次: Main 10 @L4.0)
| + 默认帧时长: 00:00:00.041708333 (对应视频轨的 23.976 帧/场每秒)
| + 轨道
| + 轨道编号: 2 (mkvmerge & mkvextract 的轨道 ID: 1)
| + 轨道 UID: 6479587235126717341
| + 轨道类型: 音频
| + 编码格式 ID: A_FLAC
| + 编解码器私有数据: 大小 113
| + 默认帧时长: 00:00:00.085333333 (对应视频轨的 11.719 帧/场每秒)
| + 语言: jpn
| + 音频轨
| + 采样率: 48000
| + 声道数: 2
| + 位深: 16
|+ EBML void: 大小 1017
|+ 章节
| + 版本条目
| + 版本标记隐藏: 0
| + 版本标记默认: 0
| + 版本 UID: 8378505658607131267
| + 章节原子
| + 章节 UID: 6813273890180198066
| + 章节时间起始: 00:00:00.000000000
| + 章节标记隐藏: 0
| + 章节标记启用: 1
| + 章节显示
| + 章节字符串: Chapter 01
| + 章节语言: eng
| + 章节原子
| + 章节 UID: 14987697612996257174
| + 章节时间起始: 00:01:22.040000000
| + 章节标记隐藏: 0
| + 章节标记启用: 1
| + 章节显示
| + 章节字符串: Chapter 02
| + 章节语言: eng
| + 章节原子
| + 章节 UID: 14973693383149842610
| + 章节时间起始: 00:07:32.035000000
| + 章节标记隐藏: 0
| + 章节标记启用: 1
| + 章节显示
| + 章节字符串: Chapter 03
| + 章节语言: eng
| + 章节原子
| + 章节 UID: 8866065700810995634
| + 章节时间起始: 00:22:42.611000000
| + 章节标记隐藏: 0
| + 章节标记启用: 1
| + 章节显示
| + 章节字符串: Chapter 04
| + 章节语言: eng
|+ EBML void: 大小 101
|+ 簇
虽然很详细,但是和mkvmerge的简略信息的主要内容是一致的。
下面,正式开始合并操作。
1.ffmpeg copy字幕为mp4文件
ffmpeg -i 1.mkv -i 1.ass -c:v copy -c:a copy -c:s mov_text 1.mp4
查看1.mp4元信息
mkvmerge -i 1.mp4
文件 「1.mp4」: 容器: QuickTime/MP4
轨道 ID 0: video (HEVC/H.265/MPEG-H)
轨道 ID 1: audio (FLAC)
轨道 ID 2: subtitles (Timed Text)
章节: 4 个条目
全局标签: 1 个条目可见,多了一个subtitles
Stream #0:0[0x1](und): Video: hevc (Main 10) (hev1 / 0x31766568), yuv420p10le(tv, bt709/unknown/unknown), 1920x1080, 2789 kb/s, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 16k tbn (default)Metadata:handler_name : VideoHandlervendor_id : [0][0][0][0]Stream #0:1[0x2](jpn): Audio: flac (fLaC / 0x43614C66), 48000 Hz, stereo, s16, 661 kb/s (default)Metadata:handler_name : SoundHandlervendor_id : [0][0][0][0]Stream #0:2[0x3](und): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)Metadata:handler_name : SubtitleHandlerStream #0:3[0x4](eng): Data: bin_data (text / 0x74786574)Metadata:handler_name : SubtitleHandler
Unsupported codec with id 98314 for input stream 3
再用几种播放器实测一下:
bilibili,加载不出字幕,也没有找到手动加载字幕的地方
win10自带的电影和电视,加载不出字幕,但是可以手动加载
win10自带的媒体播放器,加载不出字幕,也可以手动加载
VLC:会自动加载一种字幕,并且可以自行选择视频文件里面的某种字幕或者选择其他的字幕文件。
2.ffmpeg copy字幕为mkv文件
ffmpeg -i 1.mkv -i 1.ass -c:v copy -c:a copy 2.mkv
因为mkv不支持mov_text,mp4支持
同样查看2.mkv的元信息
mkvmerge -i 2.mkv
文件 「2.mkv」: 容器: Matroska
轨道 ID 0: video (HEVC/H.265/MPEG-H)
轨道 ID 1: audio (FLAC)
轨道 ID 2: subtitles (SubStationAlpha)
章节: 4 个条目
全局标签: 1 个条目
轨道 ID 2 的标签: 2 个条目
Stream #0:0: Video: hevc (Main 10), yuv420p10le(tv, bt709/unknown/unknown), 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn (default)Metadata:BPS : 2789959BPS-eng : 2789959DURATION-eng : 00:24:06.028000000NUMBER_OF_FRAMES: 34670NUMBER_OF_FRAMES-eng: 34670NUMBER_OF_BYTES : 504295001NUMBER_OF_BYTES-eng: 504295001_STATISTICS_WRITING_APP: mkvmerge v10.0.0 ('To Drown In You') 64bit_STATISTICS_WRITING_APP-eng: mkvmerge v10.0.0 ('To Drown In You') 64bit_STATISTICS_WRITING_DATE_UTC: 2019-08-06 18:43:13_STATISTICS_WRITING_DATE_UTC-eng: 2019-08-06 18:43:13_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTESDURATION : 00:24:06.027000000Stream #0:1(jpn): Audio: flac, 48000 Hz, stereo, s16 (default)Metadata:BPS : 661042BPS-eng : 661042DURATION-eng : 00:24:06.030000000NUMBER_OF_FRAMES: 16946NUMBER_OF_FRAMES-eng: 16946NUMBER_OF_BYTES : 119485830NUMBER_OF_BYTES-eng: 119485830_STATISTICS_WRITING_APP: mkvmerge v10.0.0 ('To Drown In You') 64bit_STATISTICS_WRITING_APP-eng: mkvmerge v10.0.0 ('To Drown In You') 64bit_STATISTICS_WRITING_DATE_UTC: 2019-08-06 18:43:13_STATISTICS_WRITING_DATE_UTC-eng: 2019-08-06 18:43:13_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTESDURATION : 00:24:06.029000000Stream #0:2: Subtitle: ass (ssa)Metadata:ENCODER : Lavc61.32.101 ssaDURATION : 00:24:09.510000000
2.mkv使用播放器加载,就算是VLC,默认的也不会加载字幕,需要手动选择mkv里面携带的。
3.ffmpeg把mkv和ass字幕文件合并
ffmpeg -i 1.mkv -vf "subtitles=1.ass" 3.mp4
....
[out#0/mp4 @ 0000021722278580] video:262060KiB audio:23100KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.379050%
frame=34670 fps=109 q=-1.0 Lsize= 286241KiB time=00:24:05.94 bitrate=1621.7kbits/s speed=4.53x
[libx264 @ 00000217222e3380] frame I:376 Avg QP:27.74 size: 77797
[libx264 @ 00000217222e3380] frame P:9866 Avg QP:31.12 size: 15216
[libx264 @ 00000217222e3380] frame B:24428 Avg QP:33.96 size: 3643
[libx264 @ 00000217222e3380] consecutive B-frames: 4.3% 3.8% 4.7% 87.2%
[libx264 @ 00000217222e3380] mb I I16..4: 36.8% 51.1% 12.2%
[libx264 @ 00000217222e3380] mb P I16..4: 6.7% 8.6% 1.2% P16..4: 18.9% 3.0% 1.7% 0.0% 0.0% skip:60.0%
[libx264 @ 00000217222e3380] mb B I16..4: 0.6% 0.8% 0.1% B16..8: 14.0% 0.9% 0.2% direct: 0.8% skip:82.7% L0:44.4% L1:53.6% BI: 2.0%
[libx264 @ 00000217222e3380] 8x8 transform intra:52.6% inter:82.8%
[libx264 @ 00000217222e3380] coded y,uvDC,uvAC intra: 31.8% 54.3% 16.7% inter: 3.1% 4.6% 0.2%
[libx264 @ 00000217222e3380] i16 v,h,dc,p: 25% 22% 6% 47%
[libx264 @ 00000217222e3380] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 24% 14% 23% 6% 7% 7% 6% 7% 6%
[libx264 @ 00000217222e3380] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 26% 16% 19% 6% 8% 8% 6% 7% 4%
[libx264 @ 00000217222e3380] i8c dc,h,v,p: 52% 17% 20% 12%
[libx264 @ 00000217222e3380] Weighted P-Frames: Y:4.2% UV:3.6%
[libx264 @ 00000217222e3380] ref P L0: 68.7% 17.3% 13.0% 1.0%
[libx264 @ 00000217222e3380] ref B L0: 88.0% 8.8% 3.1%
[libx264 @ 00000217222e3380] ref B L1: 97.1% 2.9%
[libx264 @ 00000217222e3380] kb/s:1484.61
[aac @ 00000217241259c0] Qavg: 778.532
这个使用cpu编码,非常的缓慢,而且吃配置,耗时很长。
ffprobe 3.mp4
Stream #0:0[0x1](und): Video: h264 (High 10) (avc1 / 0x31637661), yuv420p10le(tv, bt709/unknown/unknown, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 1484 kb/s, 23.98 fps, 23.98 tbr, 24k tbn (default)Metadata:handler_name : VideoHandlervendor_id : [0][0][0][0]encoder : Lavc61.32.101 libx264Stream #0:1[0x2](jpn): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 130 kb/s (default)Metadata:handler_name : SoundHandlervendor_id : [0][0][0][0]Stream #0:2[0x3](eng): Data: bin_data (text / 0x74786574)Metadata:handler_name : SubtitleHandler
Unsupported codec with id 98314 for input stream 2
mkvmerge -i 3.mp4
文件 「3.mp4」: 容器: QuickTime/MP4
轨道 ID 0: video (AVC/H.264/MPEG-4p10)
轨道 ID 1: audio (AAC)
章节: 4 个条目
全局标签: 1 个条目
这个使用cpu进行了重新编码,bilibili也会显示字幕,但是windows10自带的播放器都不支持这种编码,并且,VLC里面也会显示字幕,但是并不能手动选择视频里面的字幕。
4.使用GPU加速,本人提前把显卡驱动更新到了最新。
先查看设备支持的硬件减速类型:
ffmpeg -hwaccels
...
Hardware acceleration methods:
cuda
vaapi
dxva2
qsv
d3d11va
opencl
vulkan
d3d12va
amf
合并字幕命令:
ffmpeg -hwaccel cuda -i 1.mkv -vf "subtitles=1.ass" -c:v h264_nvenc -pix_fmt yuv420p -c:s mov_text 4.mp4
使用gpu还是要快很多的,并且这个过程,电脑也没有那么卡顿,当然,具体的命令可能还和电脑的GPU配置有关系,不一定所有设置都能使用本条命令。
5.使用mkvmerge
mkvmerge 1.mkv --language 0:chi 1.ass -o 5.mkv
mkvmerge v89.0 ('And the Melody Still Lingers On (Night in Tunisia)') 64-bit
「1.mkv」: 使用 「Matroska」 格式分离器。
「1.ass」: 使用 「SSA/ASS 字幕」 格式分离器。
「1.mkv」 轨道 0: 使用 「HEVC/H.265」 格式输出模块。
「1.mkv」 轨道 1: 使用 「FLAC」 格式输出模块。
「1.ass」 轨道 0: 使用 「SSA/ASS 文本字幕」 格式输出模块。
以写入模式打开文件 「5.mkv」。
正在写入 cue 条目 (索引)...
混流耗时 1 秒。
查看信息:
Stream #0:0: Video: hevc (Main 10), yuv420p10le(tv, bt709/unknown/unknown), 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn (default)Metadata:BPS : 2790128DURATION : 00:24:06.028000000NUMBER_OF_FRAMES: 34670NUMBER_OF_BYTES : 504325568_STATISTICS_WRITING_APP: mkvmerge v89.0 ('And the Melody Still Lingers On (Night in Tunisia)') 64-bit_STATISTICS_WRITING_DATE_UTC: 2025-02-07 04:41:20_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTESStream #0:1(jpn): Audio: flac, 48000 Hz, stereo, s16 (default)Metadata:BPS : 661042DURATION : 00:24:06.030000000NUMBER_OF_FRAMES: 16946NUMBER_OF_BYTES : 119485830_STATISTICS_WRITING_APP: mkvmerge v89.0 ('And the Melody Still Lingers On (Night in Tunisia)') 64-bit_STATISTICS_WRITING_DATE_UTC: 2025-02-07 04:41:20_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTESStream #0:2(chi): Subtitle: ass (ssa) (default)Metadata:BPS : 116DURATION : 00:24:09.510000000NUMBER_OF_FRAMES: 458NUMBER_OF_BYTES : 21071_STATISTICS_WRITING_APP: mkvmerge v89.0 ('And the Melody Still Lingers On (Night in Tunisia)') 64-bit_STATISTICS_WRITING_DATE_UTC: 2025-02-07 04:41:20_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
mkvmerge -i 5.mkv
文件 「5.mkv」: 容器: Matroska
轨道 ID 0: video (HEVC/H.265/MPEG-H)
轨道 ID 1: audio (FLAC)
轨道 ID 2: subtitles (SubStationAlpha)
章节: 4 个条目
这样可以指定为中文字幕,win10自带的播放器都可以选择字幕,但是bilibili还是不能加载出字幕,不过夸克网盘能识别出来,这样就好了。