从 mkv 文件中提取字幕

vla*_*nfo 49 mkv subtitle

问题是Ubuntu中的视频播放器集成中欧字幕有问题。解决方法是提取它们。有谁知道终端中是否有命令或程序可以从 mkv 文件中提取字幕?

Cor*_*ius 75

安装mkvtoolnix使用sudo apt-get install mkvtoolnix

从终端运行: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

使用mkvinfo以获取有关轨道的信息。

使用此实用程序,您可以提取任何曲目,甚至音频或视频。

  • 不要使用`mkvinfo`,因为它会说诸如“Track number: 2 (track ID for mkvmerge &amp; mkvextract: 1)”之类的东西,这很令人困惑。使用`mkvmerge -i &lt;文件名&gt;` (16认同)
  • @gcb,如果它用英语 **track ID for mkvmerge &amp; mkvextract** 表示如何混淆?很简单,只需将该轨道 ID 用于 mkvextract 或 mkvmerge。编程中数组的长度和元素索引也让你困惑? (4认同)

Art*_*yan 20

科尼利厄斯的回答终于对我有用了,但有些事情并不明显。

安装mkvtoolnix

sudo apt-get install mkvtoolnix
Run Code Online (Sandbox Code Playgroud)

检测曲目编号

mkvmerge -i some_movie.mkv
Run Code Online (Sandbox Code Playgroud)

示例输出:

File 'some_movie.mkv': container: Matroska
Track ID 0: video (MPEG-4p10/AVC/h.264)
Track ID 1: audio (AC-3/E-AC-3)
Track ID 2: subtitles (SubRip/SRT)
Chapters: 12 entries
Global tags: 2 entries
Run Code Online (Sandbox Code Playgroud)

提取曲目

句法:

mkvextract tracks <your_mkv_video> <track_number>:<subtitle_file.srt>
Run Code Online (Sandbox Code Playgroud)

请注意,和之间不能有任何空格<track_number>:<subtitle_file.srt>

例子:

mkvextract tracks "some_movie.mkv" 2:some_movie_subs.srt
Run Code Online (Sandbox Code Playgroud)


nux*_*nux 12

您可以使用 mkvtoolnix 。

sudo apt-get install mkvtoolnix
Run Code Online (Sandbox Code Playgroud)

另一个提示,因为 mkv 文件可能包含许多字幕,所以提示是这个脚本,您可以搜索您想要的语言,例如,如果您想要英语,它将只下载英语。

脚本 :

#!/bin/bash
# Extract subtitles from each MKV file in the given directory

# If no directory is given, work in local dir
if [ "$1" = "" ]; then
  DIR="."
else
  DIR="$1"
fi

# Get all the MKV files in this dir and its subdirs
find "$DIR" -type f -name '*.mkv' | while read filename
do
  # Find out which tracks contain the subtitles
  mkvmerge -i "$filename" | grep 'subtitles' | while read subline
  do
    # Grep the number of the subtitle track
    tracknumber=`echo $subline | egrep -o "[0-9]{1,2}" | head -1`

    # Get base name for subtitle
    subtitlename=${filename%.*}

    # Extract the track to a .tmp file
    `mkvextract tracks "$filename" $tracknumber:"$subtitlename.srt.tmp" > /dev/null 2>&1`
    `chmod g+rw "$subtitlename.srt.tmp"`


    # Do a super-primitive language guess: ENGLISH
    langtest=`egrep -ic ' you | to | the ' "$subtitlename".srt.tmp`
    trimregex=""



    # Check if subtitle passes our language filter (10 or more matches)
    if [ $langtest -ge 10 ]; then
      # Regex to remove credits at the end of subtitles (read my reason why!)
      `sed 's/\r//g' < "$subtitlename.srt.tmp" \
        | sed 's/%/%%/g' \
        | awk '{if (a){printf("\t")};printf $0; a=1; } /^$/{print ""; a=0;}' \
        | grep -iv "$trimregex" \
        | sed 's/\t/\r\n/g' > "$subtitlename.srt"`
      `rm "$subtitlename.srt.tmp"`
      `chmod g+rw "$subtitlename.srt"`
    else
      # Not our desired language: add a number to the filename and keep anyway, just in case
      `mv "$subtitlename.srt.tmp" "$subtitlename.$tracknumber.srt" > /dev/null 2>&1`
    fi
  done
done
Run Code Online (Sandbox Code Playgroud)

将此脚本命名为youwant.sh 并使其可执行

现在在终端将目录更改为脚本文件夹并写入 ./nameyouwant.sh /pathtosave