MKV 파일에서 자막 추출


39

문제는 우분투의 비디오 플레이어가 통합 중앙 유럽 자막에 문제가 있다는 것입니다. 해결책은이를 추출하는 것입니다. 터미널이나 프로그램에 mkv 파일에서 자막을 추출하는 명령이 있는지 아는 사람이 있습니까?

답변:


58

설치 mkvtoolnix와 함께 sudo apt-get install mkvtoolnix.

터미널에서 실행 mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

mkvinfo트랙에 대한 정보를 얻는 데 사용 합니다.

이 유틸리티를 사용하면 모든 트랙, 오디오 또는 비디오를 추출 할 수 있습니다.


9
mkvinfo혼동되는 "트랙 번호 : 2 (mkvmerge & mkvextract의 트랙 ID : 1)"와 같은 내용을 사용하지 마십시오 . 사용mkvmerge -i <filename>
gcb

에 명시된 또한 유의, 워드 프로세서 , mkvextract 트랙 형이 아니라 지정된 확장하여 파일 출력 포맷을 판단한다 (의해보고되도록 유형을 확인 mkvmerge -i <filename>).
지도 제작자

자막 데이터 (바이트)가 모든 파일 컨테이너 내에 있습니까? 비디오 파일이 클수록 작동 속도가 느리기 때문에 ... 모든 파일을 읽은 후에 만 ​​모든 파일 및 자막 추출 (매우 느림)
user25

2
@ gcb 그리고 mkvmerge & mkvextract의 영어 트랙 ID로 표시 되면 어떻게 혼란 스럽 습니까? mkvextract 또는 mkvmerge에 해당 트랙 ID를 사용하면 쉽습니다. 프로그래밍에서 배열의 길이와 요소 인덱스가 혼란 스럽습니까?
user25

8

mkvtoolnix를 사용할 수 있습니다.

sudo apt-get install mkvtoolnix

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

이 스크립트 이름 youwant.sh를 저장하고 실행 가능하게 만드십시오.

이제 터미널에서 디렉토리를 스크립트 폴더로 변경하고 작성하십시오. ./nameyouwant.sh /pathtosave


이상한 것은 하나의 비디오에서는 작동하지 않았지만 허용 된 답변에 제공된 명령을 실행하여 작동했습니다.
Hunsu

멋진 스크립트에 감사드립니다. 자막 끝에서 크레딧을 제거하는 이유를 설명해 주시겠습니까? 스크립트의 해당 부분이 작동하지 않아 빈 srt 파일이 생성됩니다.
m000

1
이 답변 computernerdfromhell.com 에서 가져온 것으로 보입니다 . 크레딧을 삭제 한 이유는 다음과 같습니다. "네덜란드 자막 사용자는 자막의 마지막 몇 줄에 크레딧이나 소리를 넣는 습관이 있습니다. 마지막 자막 줄 바로 다음에 발생한 경우를 제외하고는 아무런 문제가 없습니다. 이 영화는 5 분 더 진행될 수 있습니다. DaNoodleBrain이 부거 거저에게 소리를 지르고 싶지 않기 때문에 다른 정규 표현식으로 제거합니다. "
Dr. S.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.