如何在MKV文件中添加和删除字幕?


28

我有一个高质量的MKV文件,其中包含多个字幕选项。我想将其他字幕文件添加到列表中。我正在使用OSX。

一些在线搜索使我使用了视频转换器,并且基本上将电影重新编码为一个新文件。在我看来,这真是太过分了。另外,我可能会放宽先前的字幕,以及一些图像质量。

Answers:


41

删除字幕:

mkvmerge -o output.mkv input.mkv -S # remove all subtitle tracks
mkvmerge -o output.mkv input.mkv -s 3,4 # remove tracks 3 and 4
mkvmerge -o output.mkv input.mkv -s '!3' # remove all subtitle tracks except 3
mkvmerge -i input.mkv # show track numbers

添加字幕:

mkvmerge -o output.mkv input.mkv subs.srt
mkvmerge -o output.mkv input.mkv --language 0:ger --track-name 0:German subs.srt

提取字幕:

mkvextract tracks input.mkv 3:subs.srt
for f in *.mkv; do
  sub=$(mkvmerge -i "$f" | awk '$4=="subtitles"{print;exit}')
  [[ $sub ]] || continue
  [[ $sub =~ S_TEXT/ASS ]] && ext=ass || ext=srt
  track=$(awk -F '[ :]' '{print $3}' <<< "$sub")
  mkvextract tracks "$f" "$track:${f%mkv}$ext"
done

可以使用来安装mkvmerge和mkvextract brew install mkvtoolnix


2
MKVMerge GUI已在Mac OS X上提供,但是,对于控制台迷来说,这是一个很好的方法。
波拉2013年

请注意,以上添加字幕的命令在播放文件时还将字幕设置为“默认启用”。(可以使用MKVMerge GUI确认此标志。)为避免这种情况,请使用--default-track '0:0'
Mathias Bynens

4

显示字幕的基本方法有两种。您可以将像素编码为视频本身。这称为“硬订阅”。这里的优势是视频播放器的简单性,它只是一个视频流。缺点是您必须重新编码视频,这需要时间,并且会损失一些保真度。如果您获得更好的翻译,那么它就是视频中的像素。而且您只能使用一种语言。

更好的是“ softsubbing”,即在某个地方将文本文件与视频流分开。字幕文件有很多不同的格式,但是它们的基本核心都是“文本,开始什么时间,删除什么时间”。有些具有附加功能,例如屏幕上的颜色和方向。这样做的好处是您可以使用多种语言(例如DVD,可以使用多种语言),并且可以在文件中修复错别字等。而且,如果您不需要字幕,那么只需将其关闭即可。

软字幕可以是单独的文件-大多数播放器会自动寻找与主视频名称相同(不同扩展名)的字幕。或者某些容器文件格式(例如MKV)可以将它们嵌入其中。MKVtoolnix(有一个mac端口)以获取MKV文件工具。这样一来,您无需重新编码即可嵌入软订阅。

请注意,并非所有播放器都能支持所有格式。我的经验是XBMC的SSA文件有问题,但是简单得多的SRT文件就可以了。如果您的平台支持VLC,则它将播放任何内容。


1
好的答案,尽管应该指出,某些软字幕(尤其是DVD字幕)是基于位图的,而不是基于文本的。其主要作用是使它们几乎无法编辑-_-
evilsoup

@evilsoup谢谢,不知道。
Rich Homolka

1
是的,IDX + SUB VOBsub,其中IDX是文本文件,但是SUB包含位图。
卡兰2013年

更改了直接下载页面的链接。
波拉2013年

0

我意识到这是一个古老的问题user495470,自2013年以来,答案已经被接受,但是由于该问题的一部分是关于在文件中添加字幕的,所以我想添加此新内容。

基本上,我需要将数十个.ass字幕合并到名称相似的MKV文件中,因此一次执行一个命令并不会减少它。因此,我整理了这个简单的Bash脚本,该脚本将在运行该目录的当前目录中搜索.ass文件,然后按预期进行合并。

find -E . -maxdepth 1 -type f -iregex '.*\.(ASS|SRT)$' |\
  while read FILEPATH
  do
    DIRNAME=$(dirname "${FILEPATH}");
    BASENAME=$(basename "${FILEPATH}");
    FILENAME="${BASENAME%.*}";
    EXTENSION="${BASENAME##*.}"
    mkvmerge -o "/Users/jake/${FILENAME}"-NEW.mkv "${FILENAME}".mp4 --language 0:eng --track-name 0:English "${FILENAME}"."${EXTENSION}"
  done

当然,这个简单的脚本假定字幕是英语并按原样合并它们,但是可以根据需要进行手动调整。通过这样的简单脚本解决了自动将字幕与MKV合并的大问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.