从 mkv 文件中提取字幕

从 mkv 文件中提取字幕

我已经安装了MKVToolNixSubtitle edit。我能够Subtitle edit通过 OCR 提取字幕。虽然它可用,但它有很多错误。

现在我想到用 来MKVToolNix提取字幕。我可以看到它列在音频和视频轨道中。但我不知道如何将其从程序中取出。

在参考了 Google 和这里​​的一些指南后,我也尝试了一些 FFMPEG 命令。但都不起作用。例如

ffmpeg -i Movie.mkv -map 0:s:0:  subs.srt

如果有人能帮助我找到解决方案,那就太好了。谢谢。

注:我使用的是 Ubuntu 18.04。

答案1

我用MKVCleaver因为它为mkvtoolnixWindows 提供了一个简单的 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

相关内容