Trích xuất phụ đề từ tập tin mkv


39

Vấn đề là các videoplayers trong Ubuntu có vấn đề với phụ đề trung tâm châu Âu tích hợp. Giải pháp là trích xuất chúng. Có ai biết nếu có một lệnh trong thiết bị đầu cuối hoặc một chương trình để trích xuất phụ đề từ một tệp mkv?

Câu trả lời:


58

Cài đặt mkvtoolnixvới sudo apt-get install mkvtoolnix.

Chạy từ thiết bị đầu cuối: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

Sử dụng mkvinfođể có được thông tin về các bài hát.

Sử dụng tiện ích này, bạn có thể trích xuất bất kỳ bản nhạc, thậm chí âm thanh hoặc video.


9
không sử dụng mkvinfovì nó nói những thứ như "Số theo dõi: 2 (ID theo dõi cho mkvmerge & mkvextract: 1)" gây nhầm lẫn. sử dụngmkvmerge -i <filename>
gcb

Cũng lưu ý rằng, như được chỉ định trong tài liệu , mkvextract xác định định dạng đầu ra tệp theo loại theo dõi, không phải phần mở rộng đã cho (vì vậy hãy kiểm tra loại như được báo cáo bởi mkvmerge -i <filename>).
vẽ bản đồ

dữ liệu (byte) của phụ đề được đặt trong tất cả các tập tin chứa? bởi vì tệp video càng lớn thì nó càng hoạt động chậm hơn ... tất cả các tệp và trích xuất phụ đề chỉ sau khi đọc tất cả các tệp (rất chậm)
user25

2
@gcb và thật khó hiểu nếu nó nói bằng ID theo dõi tiếng Anh cho mkvmerge & mkvextract ? thật dễ dàng, chỉ cần sử dụng ID theo dõi đó cho mkvextract hoặc mkvmerge. Độ dài và chỉ số của các phần tử trong lập trình cũng gây nhầm lẫn cho bạn?
dùng25

8

bạn có thể sử dụng mkvtoolnix.

sudo apt-get install mkvtoolnix

Một mẹo khác bây giờ vì các tệp mkv có thể chứa nhiều phụ đề, vì vậy mẹo này là tập lệnh này mà bạn có thể tìm kiếm ngôn ngữ bạn muốn, vì vậy, nếu bạn muốn tiếng Anh, nó sẽ chỉ tải xuống tiếng Anh.

Kịch bản :

#!/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

Lưu tập lệnh này nameyouwant.sh và làm cho nó có thể thực thi được

Bây giờ trong thư mục thay đổi thiết bị đầu cuối vào thư mục script và viết ./nameyouwant.sh /pathtosave


Điều kỳ lạ, nó không hoạt động cho một video nhưng bằng cách thực hiện các lệnh được đưa ra trong câu trả lời được chấp nhận, nó đã hoạt động.
Hunsu

Cảm ơn kịch bản tiện lợi. Bạn có thể thêm một lời giải thích tại sao bạn xóa các khoản tín dụng ở cuối phụ đề không? Phần kịch bản đó không hoạt động với tôi và dẫn đến một tệp srt trống.
m000

1
Câu trả lời này dường như được lấy từ computernerdfromhell.com . Lý do được đưa ra để xóa các khoản tín dụng là: "Những người phụ đề Hà Lan có thói quen đặt các khoản tín dụng hoặc hét lên trong một vài dòng cuối của phụ đề. Không có gì sai với điều đó, ngoại trừ khi nó xảy ra ngay sau dòng cuối cùng được nói trong Bộ phim có thể tiếp tục trong 5 phút nữa, tôi không muốn kết thúc sự tán tỉnh của DaNoodleBrain đã mang lại tiếng hét cho BoogerGuzzler, vì vậy tôi loại bỏ chúng bằng một regex đơn giản khác "
Dror S.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.