แยกคำบรรยายออกจากไฟล์ mkv


39

ปัญหาคือผู้ทำวิดีโอในอูบุนตูมีปัญหากับคำบรรยายกลางยุโรปแบบบูรณาการการแก้ปัญหาคือการแยกมันออก ไม่มีใครรู้ว่ามีคำสั่งใน terminal หรือโปรแกรมที่จะแยกคำบรรยายจากไฟล์ mkv หรือไม่?

คำตอบ:


58

ติดตั้งด้วยmkvtoolnixsudo apt-get install mkvtoolnix

เรียกใช้จากเทอร์มินัล: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

ใช้mkvinfoเพื่อรับข้อมูลเกี่ยวกับแทร็ก

การใช้ยูทิลิตี้นี้คุณสามารถแยกแทร็กใด ๆ รวมถึงเสียงหรือวิดีโอ


9
อย่าใช้mkvinfoตามที่ระบุไว้เช่น "หมายเลขการติดตาม: 2 (รหัสการติดตามสำหรับ mkvmerge & mkvextract: 1)" ซึ่งทำให้เกิดความสับสน ใช้mkvmerge -i <filename>
gcb

นอกจากนี้ทราบว่าตามที่ระบุในเอกสาร , mkvextract กำหนดรูปแบบออกไฟล์ตามประเภทแทร็คไม่ขยายกำหนด (เพื่อตรวจสอบประเภทตามการรายงานmkvmerge -i <filename>)
นักทำแผนที่

ข้อมูล (ไบต์) ของคำบรรยายวางอยู่ภายในคอนเทนเนอร์ไฟล์ทั้งหมดหรือไม่ เพราะไฟล์วิดีโอที่ใหญ่กว่าทำงานช้าลง ... (500mb 1 gb 4gb .mkv ไฟล์) ฉันคิดว่ามันจะทำงานได้เร็วขึ้นมากและฉันคิดว่าไบต์ของคำบรรยายถูกวางไว้ที่ส่วนเฉพาะของไฟล์คอนเทนเนอร์วิดีโอ แต่ดูเหมือนว่า ffmpeg หรือ mkvextract อ่าน ไฟล์ทั้งหมดและแยกคำบรรยายหลังจากอ่านไฟล์ทั้งหมด (ช้ามาก)
25

2
@gcb และมันจะสับสนอย่างไรถ้ามันบอกว่าในtrack trackภาษาอังกฤษสำหรับ mkvmerge & mkvextract ? มันง่ายมากเพียงใช้รหัสติดตามสำหรับ mkvextract หรือ mkvmerge ความยาวของอาเรย์และดัชนีองค์ประกอบในการเขียนโปรแกรมนั้นทำให้คุณสับสนเช่นกัน?
25

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 ออกไปให้ BoogerGuzzler ออกไปเลยฉันจึงเอาพวกมันออกจาก regex ง่ายๆ "
Dror S.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.