我已经安装了MKVToolNix
和Subtitle edit
。我能够Subtitle edit
通过 OCR 提取字幕。虽然它可用,但它有很多错误。
现在我想到用 来MKVToolNix
提取字幕。我可以看到它列在音频和视频轨道中。但我不知道如何将其从程序中取出。
在参考了 Google 和这里的一些指南后,我也尝试了一些 FFMPEG 命令。但都不起作用。例如
ffmpeg -i Movie.mkv -map 0:s:0: subs.srt
如果有人能帮助我找到解决方案,那就太好了。谢谢。
注:我使用的是 Ubuntu 18.04。
答案1
我用MKVCleaver因为它为mkvtoolnix
Windows 提供了一个简单的 GUI 界面。
您只需将 MKV 文件(或文件)拖放到其中,单击要提取的曲目的复选框,然后单击“提取曲目”即可。
默认情况下,您的字幕轨道将以名称导出FileName_TrackNo.ext
。对于 DVD 字幕,它将导出两个文件,字幕时间和位置位置的索引以及实际的图形字幕。
然后你可以将这些文件导入 SubtitleEdit。我发现它比它更可靠、更准确。副标题編輯单独地,由于某种原因,它的 DVD/MKV 提取器并不完全可靠。
对于命令行和替代操作系统(您提到 Ubuntu),您可以使用mkvextract
它作为您已安装的 mkvtoolnix 的一部分。
来自一个回答哥尼流在从 mkv 中提取字幕在 AskUbuntu 上:
从终端运行:
mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>
用于
mkvinfo
获取有关曲目的信息。
虽然评论建议使用mkvmerge -i <filename>
来获取更直接可用的曲目编号mkvextract
。正如您所提到的,ffmpeg -i filename.mkv
也是可用的。
答案2
MKVCleaver 是一个不错的选择,具有清晰的 GUI。但由于没有人纠正ffmpeg命令,您也可以使用它来执行此操作。您只需在 -map 末尾多一个冒号即可。
这是一个工作ffmpeg命令:
ffmpeg -i Movie.mkv -map 0:s:0 subs.srt
答案3
我使用字幕编辑 https://www.videohelp.com/software/Subtitle-Edit
只需拖入 mkv 文件,然后在从 mkv 文件中选择所需的字幕后按保存,您也可以轻松编辑它
答案4
我知道这里已经有几个答案了,但是如果您需要在 macOS 上使用命令行,那么都没有完全回答这个问题,所以我也添加了我的答案。
这实际上是被莫库拜在他对这个问题的评论中:有一个类似问题在 AskUbuntu 论坛上,以及答案之一提供了完整的脚本,但是它不起作用。
我从头重写了脚本,并对其进行了适当的注释以防有人稍后需要调整它。你只需要已安装 MKVToolNix,没有其他依赖项。
编辑[2023-08-03]:我创建单独的要点对于这个脚本,我将在将来需要时更新它。
#!/bin/sh
# Extract subtitles from each MKV/MP4 file in the given directory
# MKVToolNix path - Leave empty if you have the tools added to $PATH.
# This is needed e.g. on macOS, if you downloaded MKVToolNix app
# and just dragged it to the Applications folder.
toolPath='/Applications/MKVToolNix.app/Contents/MacOS/'
# If no directory is given, work in local dir
if [ "$1" = "" ]; then
DIR="."
else
DIR="$1"
fi
# Get all MKV/MP4 files in this dir and its subdirs
find "$DIR" -type f \( -iname '*.mkv' -o -iname '*.mp4' \) | while read filename
do
echo "Processing file $filename:"
# Get base file name (without extension)
fileBasename=${filename%.*}
# Parse info about all subtitles tracks from file. This will output lines in the
# following format, one line per subtitle track, fields delimited by tabulator:
# trackID <tab> trackLanguage <tab> trackCodecID <tab> trackCodec
"${toolPath}mkvmerge" -J "$filename" | python -c "exec(\"import sys, json;\nfor track in json.load(sys.stdin)['tracks']:\n\tif track['type'] == 'subtitles':\n\t\tprint(str(track['id']) + '\t' + track['properties']['language'] + '\t' + track['properties']['codec_id'] + '\t' + track['codec'])\")" | while IFS=$'\t' read -r trackNumber trackLanguage trackCodecID trackCodec;
do
# optional: process only some types of subtitle tracks (according to $trackCodecID)
# See codec types here: https://tools.ietf.org/id/draft-lhomme-cellar-codec-00.html#rfc.section.6.5
if [[ $trackCodecID == 'S_VOBSUB' || $trackCodecID == 'unwantedID_#2' ]] ; then
echo " skipping track #${trackNumber}: $trackLanguage ($trackCodec, $trackCodecID)"
continue;
fi
echo " extracting track #${trackNumber}: $trackLanguage ($trackCodec, $trackCodecID)"
# extract track with language and track id
`"${toolPath}mkvextract" tracks "$filename" $trackNumber:"$fileBasename $trackNumber($trackLanguage).srt" > /dev/null 2>&1`
done
done