Извлечение субтитров из файла mkv

Вопрос или проблема

Я установил MKVToolNix и Subtitle edit. Я смог извлечь субтитры с помощью Subtitle edit через OCR. Хотя это и работает, в нем много ошибок.

Теперь я подумал использовать MKVToolNix для извлечения субтитров. Я вижу его в списке аудио- и видеодорожек. Но я не уверен, как извлечь его из программы.

После ссылки на несколько руководств в Google и здесь я также попробовал несколько команд FFMPEG. Ни одна из них не сработала. Например

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

Было бы здорово, если кто-то сможет помочь мне найти решение. Спасибо.

PS: Я использую Ubuntu 18.04.

Я использую MKVCleaver для этого, так как он предоставляет простой интерфейс GUI для mkvtoolnix на Windows.

Вы можете просто перетащить файл MKV (или файлы) на него, поставить галочки для дорожек, которые хотите извлечь, а затем нажать “Извлечь дорожки”.

По умолчанию ваши дорожки субтитров будут экспортироваться с именем FileName_TrackNo.ext. Для DVD-субтитров он экспортирует два файла: индекс времени субтитров и их позиции, а также сами графические субтитры.

Затем вы можете импортировать эти файлы в SubtitleEdit. Я нашел его более надежным и точным, чем 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 также применимо.

MKVCleaver — хороший вариант с четким интерфейсом GUI. Но поскольку никто не исправил команду ffmpeg, вы также можете использовать её. У вас просто была одна лишняя двоеточие в конце -map.

Вот рабочая команда ffmpeg:

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

Я использую Subtitle Edit
https://www.videohelp.com/software/Subtitle-Edit

просто перетащите файл mkv и затем нажмите сохранить после выбора нужного субтитра из файла mkv, и вы можете легко его редактировать

Я использовал Inviska MKV Extract, который требовал MKVToolNix(52.0.0), на MacOS 10.14.6 и все работало прекрасно. Просто перетащите несколько файлов .mkv, выберите, что вам нужно из каждого файла, аудио или субтитры, и нажмите начать.

Я знаю, что здесь уже есть несколько ответов, но ни один из них полностью не отвечает на вопрос, если вам нужно использовать командную строку на macOS, поэтому я добавляю свой ответ тоже.

Это на самом деле заметил mokubai в своем комментарии к этому вопросу: есть подобный вопрос на форумах AskUbuntu, и один из ответов предоставляет полный скрипт, однако он не работает.

Я переписал скрипт с нуля и также правильно прокомментировал его, на случай, если кто-то захочет его позже подправить. Вам нужно иметь установленный MKVToolNix, никаких других зависимостей.

EDIT [2023-08-03]: Я создал отдельный Gist для этого скрипта, где я буду обновлять его в будущем при необходимости.

#!/bin/sh
# Извлечение субтитров из каждого MKV/MP4 файла в указанной директории

# Путь к MKVToolNix - оставьте пустым, если у вас есть инструменты, добавленные в $PATH.
#   Это необходимо, например, на macOS, если вы загрузили приложение MKVToolNix
#   и просто перетащили его в папку Программы.
toolPath="/Applications/MKVToolNix.app/Contents/MacOS/"

# Если директория не указана, работайте в локальной директории
if [ "$1" = "" ]; then
  DIR="."
else
  DIR="$1"
fi

# Получить все MKV/MP4 файлы в этой директории и ее поддиректориях
find "$DIR" -type f \( -iname '*.mkv' -o -iname '*.mp4' \) | while read filename
do
  echo "Обрабатываю файл $filename:"

  # Получить базовое имя файла (без расширения)
  fileBasename=${filename%.*}

  # Парсинг информации о всех дорожках субтитров из файла. Это будет выводить строки в следующем формате, по одной строке на дорожку субтитров, поля разделены табуляцией:
  #   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
    # необязательно: обрабатывайте только некоторые типы дорожек субтитров (в соответствии с $trackCodecID)
    #   Посмотрите типы кодеков здесь: https://tools.ietf.org/id/draft-lhomme-cellar-codec-00.html#rfc.section.6.5
    if [[ $trackCodecID == 'S_VOBSUB' || $trackCodecID == 'unwantedID_#2' ]] ; then
      echo "  пропускаю дорожку #${trackNumber}: $trackLanguage ($trackCodec, $trackCodecID)"
      continue;
    fi

    echo "  извлечение дорожки #${trackNumber}: $trackLanguage ($trackCodec, $trackCodecID)"

    # извлечь дорожку с языком и идентификатором дорожки
    `"${toolPath}mkvextract" tracks "$filename" $trackNumber:"$fileBasename $trackNumber($trackLanguage).srt" > /dev/null 2>&1`
  done
done

Мои десять центов…
Возможно, это только один аспект, но я просто написал простой скрипт в виде пакетного файла для Windows, чтобы извлечь все SRT-субтитры из видео MKV. Скрипт проходит по всем файлам MKV в текущей директории и создает один SRT-файл для каждого субтитра. Каждый результирующий файл субтитров называется так, чтобы указать, был ли он “принудительным”, а также его язык.

Я не эксперт в сценариях, и он может быть не красивым, но он работает для меня.

@ECHO OFF
REM Пакетный скрипт Windows, который извлекает SRT-субтитры из видеофайлов MKV.
REM Формат имени файла [VIDEOFILENAME].[FLAG-FORCED][LANGUAGECODE].srt
REM например, TestFile.1eng.srt для принудительного английского трека или TestFile.0eng.srt для непринудительного 
setlocal enabledelayedexpansion
for %%f in (*.mkv) do (
  ffprobe "%%f" -v panic -show_entries stream=index -select_streams v -of compact=p=0:nk=1 > probetmpfile
  set /p videoID= < probetmpfile
  ffprobe "%%f" -v panic -show_entries stream=index -select_streams a -of compact=p=0:nk=1 > probetmpfile
  set /p audioID= < probetmpfile
  ffprobe "%%f" -v panic -show_entries stream=index:disposition=forced:stream_tags=language -select_streams s -of compact=p=0:nk=1 > probetmpfile
  for /L %%n in (0,1,99) do (
    findstr %%n probetmpfile > tmpfile
    set fileIsBlank=1
    for /F %%a in (tmpfile) do set fileIsBlank=0
    if %%n EQU !videoID! set fileIsBlank=1
    if %%n EQU !audioID! set fileIsBlank=1
    if !fileIsBlank! EQU 0 (
      set /p subIdLang= < tmpFile
      if %%n LSS 10 (mkvextract tracks "%%f" %%n:"%%~nf.!subIdLang:~2,1!!subIdLang:~4!.srt") else (mkvextract tracks "%%f" %%n:"%%~nf.!subIdLang:~3,1!!subIdLang:~5!.srt")
    )
  )
)
del tmpfile
del probetmpfile
pause

Следующий пакетный скрипт основан на этом ответе Пер Нордквист. Мне это нужно было, чтобы решить проблемы с различными форматами субтитров без необходимости проверять содержимое извлеченных субтитров, чтобы определить кодек и правильное расширение файла или справляться с отсутствующими языковыми тегами; возможно, это поможет кому-то еще. В настоящее время поддерживаются кодеки subrip, vobsub и hdmv/pgs. Субтитры других кодеков будут экспортированы, но, скорее всего, не имеют правильного расширения файла. Поддержка дополнительных кодеков может быть легко добавлена (см. строки 11, 12). Работает рекурсивно из текущей директории. Не работает с файлами или папками, содержащими “!” в имени; они пропускаются.

@echo off && setlocal EnableDelayedExpansion
for /f "usebackq delims=;" %%F in (`dir /s /b *.mkv`) do (
    set filename=%%F
    set basename=%%~nF
    set filepath=%%~dF%%~pF
    ffprobe "!filename!" -v panic -show_entries stream=index,codec_name:disposition=forced:stream_tags=language -select_streams s -of compact=p=0:nk=1:s=;>probetmpfile
    for /f "usebackq" %%L in (probetmpfile) do (
        set line=%%L
        for /f "tokens=1,2,3,4 delims=;" %%A in ("!line!") do (
            if %%B==subrip set ext=srt
            if %%B==hdmv_pgs_subtitle set ext=sup                
            if defined %%D (set newname=!basename! [%%A].%%D.!ext!) else (set newname=!basename! [%%A].!ext!)
            mkvextract tracks "!filename!" %%A:"!filepath!!newname!"
        )
    )
    del probetmpfile
)

И еще раз, только на этот раз без отложенного расширения, и, следовательно, работает, если путь или имя файла содержат восклицательные знаки “!”.

@echo off
for /f "usebackq delims=;" %%F in (`dir /s /b *.mkv`) do (
    ffprobe "%%F" -v panic -show_entries stream=index,codec_name:disposition=forced:stream_tags=language -select_streams s -of compact=p=0:nk=1:s=;>probetmpfile
    for /f "usebackq" %%L in (probetmpfile) do (
        for /f "tokens=1,2,3,4 delims=;" %%A in ("%%L") do (
            if "%%D"=="" (
                if %%B==subrip (
                    mkvextract tracks "%%F" %%A:"%%~dF%%~pF%%~nF [%%A].srt"
                ) else if %%B==hdmv_pgs_subtitle (
                    mkvextract tracks "%%F" %%A:"%%~dF%%~pF%%~nF [%%A].sup"
                ) else (
                    mkvextract tracks "%%F" %%A:"%%~dF%%~pF%%~nF [%%A].%%B"
                )
            ) else (
                if %%B==subrip (
                    mkvextract tracks "%%F" %%A:"%%~dF%%~pF%%~nF [%%A].%%D.srt"
                ) else if %%B==hdmv_pgs_subtitle (
                    mkvextract tracks "%%F" %%A:"%%~dF%%~pF%%~nF [%%A].%%D.sup"
                ) else (
                    mkvextract tracks "%%F" %%A:"%%~dF%%~pF%%~nF [%%A].%%D.%%B"
                )
            )
        )
    )
    del probetmpfile
)

Используя arch linux и yay (предполагая, что у вас есть доступ к репозиторию aur), выполните:

yay -S mkv-extractor-qt

Затем запустите MKV Extractor:

mkv extractor

Теперь загрузите файл .mkv (F2):

mkv file loaded

Теперь отметьте файл субтитров, который вы хотите извлечь:

subtitle stream checked

Наконец, нажмите на Выполнить внизу и наслаждайтесь вашим .srt файлом в той же директории, что и файл .mkv, который вы выбрали.

Ответ или решение

Извлечение субтитров из файлов MKV может быть выполнено различными способами в зависимости от ваших предпочтений и используемого программного обеспечения. В данной статье мы рассмотрим основные методы извлечения субтитров, такие как использование MKVToolNix, mkvextract, а также использование FFmpeg.

1. Использование MKVToolNix и mkvextract

MKVToolNix — это мощный набор инструментов для работы с MKV-файлами, включая возможности извлечения. Для начала убедитесь, что программное обеспечение установлено на вашем компьютере. В Ubuntu это можно сделать с помощью следующей команды:

sudo apt install mkvtoolnix

Шаги для извлечения субтитров:

  1. Получите информацию о треках. Откройте терминал и выполните следующую команду для получения списка доступных треков в вашем файле:

    mkvinfo ваш_файл.mkv

    В выводе вы увидите номера и типы треков, включая субтитры. Обратите внимание на номер трека субтитров, который вам нужно извлечь.

  2. Извлечение субтитров. Используйте следующую команду, подставив вместо <номер_трека> соответствующий номер, который вы получили на предыдущем шаге:

    mkvextract tracks ваш_файл.mkv <номер_трека>:subtitles.srt

    Например, если вам нужно извлечь первый трек субтитров:

    mkvextract tracks ваш_файл.mkv 0:subtitles.srt

Эта команда создаст файл subtitles.srt в текущем каталоге с извлеченными субтитрами.

2. Использование FFmpeg

Также возможно использование FFmpeg для извлечения субтитров. Убедитесь, что этот инструмент установлен:

sudo apt install ffmpeg

Команда для извлечения:

Для извлечения первого трека субтитров используйте следующую команду (обратите внимание, что в предыдущем примере была ошибка с лишним двоеточием):

ffmpeg -i ваш_файл.mkv -map 0:s:0 subtitles.srt

Здесь 0:s:0 указывает на извлечение первого трека субтитров.

3. Использование графического интерфейса

Если вы предпочитаете графические интерфейсы, вы можете использовать MKVToolNix GUI или Subtitle Edit. В MKVToolNix GUI необходимо:

  1. Перетащить файл MKV в окно программы.
  2. Выделить нужный трек субтитров.
  3. Нажать кнопку "Извлечь" или "Сохранить", чтобы сохранить субтитры в желаемом формате.

Заключение

Извлечение субтитров из файлов MKV может быть выполнено несколькими способами; наиболее подходящий вариант будет зависеть от ваших предпочтений к работе с командной строкой или графическими интерфейсами. Инструменты, такие как MKVToolNix и FFmpeg, предлагают мощные решения для работы с видео и субтитрами. Мы надеемся, что данное руководство поможет вам успешно извлечь субтитры. Если у вас возникли вопросы или сложности, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...