mkv和ass字幕文件合并

主要使用两种工具:ffmpeg和mkvmerge

操作系统:windows10及以上

ffmpeg下载:

image-20250207091127803

https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl-shared.zip

mkvmerge下载:

image-20250207091206993

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             : 2789959
      BPS-eng         : 2789959
      DURATION        : 00:24:06.028000000
      DURATION-eng    : 00:24:06.028000000
      NUMBER_OF_FRAMES: 34670
      NUMBER_OF_FRAMES-eng: 34670
      NUMBER_OF_BYTES : 504295001
      NUMBER_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_BYTES
  Stream #0:1(jpn): Audio: flac, 48000 Hz, stereo, s16 (default)
    Metadata:
      BPS             : 661042
      BPS-eng         : 661042
      DURATION        : 00:24:06.030000000
      DURATION-eng    : 00:24:06.030000000
      NUMBER_OF_FRAMES: 16946
      NUMBER_OF_FRAMES-eng: 16946
      NUMBER_OF_BYTES : 119485830
      NUMBER_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    : VideoHandler
      vendor_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    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:2[0x3](und): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)
    Metadata:
      handler_name    : SubtitleHandler
  Stream #0:3[0x4](eng): Data: bin_data (text / 0x74786574)
    Metadata:
      handler_name    : SubtitleHandler
Unsupported codec with id 98314 for input stream 3

再用几种播放器实测一下:

bilibili,加载不出字幕,也没有找到手动加载字幕的地方

win10自带的电影和电视,加载不出字幕,但是可以手动加载

image-20250207093702206

win10自带的媒体播放器,加载不出字幕,也可以手动加载

image-20250207093755351

VLC:会自动加载一种字幕,并且可以自行选择视频文件里面的某种字幕或者选择其他的字幕文件。

image-20250207093913918

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             : 2789959
      BPS-eng         : 2789959
      DURATION-eng    : 00:24:06.028000000
      NUMBER_OF_FRAMES: 34670
      NUMBER_OF_FRAMES-eng: 34670
      NUMBER_OF_BYTES : 504295001
      NUMBER_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_BYTES
      DURATION        : 00:24:06.027000000
  Stream #0:1(jpn): Audio: flac, 48000 Hz, stereo, s16 (default)
    Metadata:
      BPS             : 661042
      BPS-eng         : 661042
      DURATION-eng    : 00:24:06.030000000
      NUMBER_OF_FRAMES: 16946
      NUMBER_OF_FRAMES-eng: 16946
      NUMBER_OF_BYTES : 119485830
      NUMBER_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
      DURATION        : 00:24:06.029000000
  Stream #0:2: Subtitle: ass (ssa)
    Metadata:
      ENCODER         : Lavc61.32.101 ssa
      DURATION        : 00:24:09.510000000

2.mkv使用播放器加载,就算是VLC,默认的也不会加载字幕,需要手动选择mkv里面携带的。

image-20250207094048072

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

image-20250207095006317

这个使用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    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc61.32.101 libx264
  Stream #0:1[0x2](jpn): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 130 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_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

image-20250207100131794

使用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             : 2790128
      DURATION        : 00:24:06.028000000
      NUMBER_OF_FRAMES: 34670
      NUMBER_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_BYTES
  Stream #0:1(jpn): Audio: flac, 48000 Hz, stereo, s16 (default)
    Metadata:
      BPS             : 661042
      DURATION        : 00:24:06.030000000
      NUMBER_OF_FRAMES: 16946
      NUMBER_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_BYTES
  Stream #0:2(chi): Subtitle: ass (ssa) (default)
    Metadata:
      BPS             : 116
      DURATION        : 00:24:09.510000000
      NUMBER_OF_FRAMES: 458
      NUMBER_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还是不能加载出字幕,不过夸克网盘能识别出来,这样就好了。

使用mkvmerge是非常迅速的,不需要重新编码,加载字幕也很正常,播放器稍微给力点就好了。

posted @   念秋  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示