Автоматизация выгрузки субтитров из *.mkv файлов
Пару месяцев назад у меня появился телевизор со SmartTV от Samsung. Девайс быстро подружился с медиацентром (роль которого исполняет Plex Media Server) с помощью нативного приложения, однако почти сразу же обнаружился весьма неприятный недостаток — отсутствие поддержки вшитых субтитров в *.mkv. Перспектива ручками извлекать субтитры из каждого файла меня отнюдь не радовала, и, поскольку торрент-клиент крутится на той же машине, что и медиасервер, было принято решение автоматизировать процесс обработки скачанных фильмов.
Под катом — рассказ о том, как при помощи 30 строчек кода на js пары шелл-скриптов и плагина для Deluge привести *mkv-файлы в удобоваримый для телевизора вид.
Исходные данные
Итак, у нас есть: headless-машина с Ubuntu Server 12.04LTS, Deluge 1.3.5 и Plex Media Server 0.9.7.28 с веб-интерфейсом. Для начала составим мини-ТЗ.
- обработка данных о свежескачанном торренте и вычленение списка *.mkv-файлов;
- извлечение субтитров;
- обновление медиатеки Plex’a.
- иметь возможность извлекать субтитры только для определенных языков;
- иметь возможность вручную скормить скрипту произвольный файл.
Хук для deluge
В базовой установке Deluge присутствует плагин Execute, позволяющий выполнить произвольный скрипт при добавлении торрента и/или завершении его загрузки (документацию и примеры можно посмотреть здесь). Нас же интересует лишь точный формат передаваемых аргументов, описания которого в манах нет, но пример которого можно легко получить с помощью тестового скрипта:
#!/bin/bash echo -e "$1\n$2\n$3" >> /specshare/sample.txt
Сохраним скрипт в какой-нибудь общедоступной директории (я использовал для этого кастомную директорию /specshare) под именем testhook.sh и дадим нужные права на исполнение с помощью
sudo chmod +x testhook.sh

Далее необходимо подключить скрипт. Для удаленного доступа к Deluge я использую GTK-клиент, в котором последовательность действий такова:
- открываем в нем Edit-Preferences-Plugins и ставим галочку напротив Execute, после чего на панели Categories появится соответствующий пункт;
- в разделе Execute, в комбо-боксе Event ставим Torrent Complete, в поле Command указываем путь к скрипту:
- жмем Add, OK, после чего перезапускаем демона:
sudo service deluged restart
Последний шаг необходим, иначе скрипт попросту не будет вызываться, при этом корректно отображаясь в настройках. Теперь ставим на закачку небольшой торрент и получаем в файле sample.txt что-то вроде:
1759d534dbe371565632ec0cccbb1579d344c5ca
Totally.Legal.Open.Source.Software.iso
/store/distribs
Первый параметр — универсальный идентификатор торрента, позволяющий запросить по нему у демона дополнительную информацию. Второй — имя торрента; как правило, это либо имя файла, либо имя директории (если файлов в раздаче несколько). Третий — имя родительской папки для торрента.
Теперь, когда мы знаем, как выглядят входные параметры, создадим два файла в той же директории, где лежал testhook.sh: extractor.sh и deluge-movie-callback.sh. Первый скрипт будет отвечать за непосредственное извлечение субтитров, и к нему мы вернемся чуть позже, а во второй файл введем следующее:
#!/bin/bash torrentname=$2; torrentpath=$(readlink -f "$3"); fullpath="$torrentpath/$torrentname"; echo "=========================== $(date +"%D %T"): $1 $2 $3" >> /specshare/log.txt; echo "$(date +"%D %T"): $fullpath" >> /specshare/log.txt; if [[ "$fullpath" != /store/films/* ]]; then echo "$(date +"%D %T"): Invalid path" >> /specshare/log.txt; exit 0; fi; echo "$(date +"%D %T"): path ok" >> /specshare/log.txt; mkvlist=$(find "$fullpath" -type f | grep .mkv); while read -r fname; do /specshare/extractor.sh "$fname" "eng,rus,unk"; done
Ничего особо сложного здесь не происходит — мы склеиваем полное имя файла из аргументов $3 и $2, разрешаем симлинки (ежели таковые найдутся), валидируем путь (фильмы и только они скачиваются в директорию /store/films, для остальных видеофайлов мне не нужны субтитры) и для полученного пути запрашиваем все вложенные mkv-файлы. После этого для каждого .mkv запускаем extractor.sh, передавая в качестве параметра путь и список кодов ISO 639-1 для необходимых языков. «unk» — это наше собственное обозначение для отсутствующего языка, на случай, если для каких-то потоков с субтитрами он не указан. Выполнение скрипта логгируется.
Небольшое замечание о логах
Писать логи куда попало, в общем-то, нехорошо, но мы пожертвуем правильностью в угоду удобству доступа и простоте (в моем случае /specshare расшарена через самбу и с минимумом телодвижений доступна на виндовом десктопе).
Извлечение субтитров
Для извлечения дорожек с субтитрами воспользуемся пакетом mkvtoolnix. Установка проста:
sudo apt-get install mkvtoolnix
Нас интересует две утилиты: mkvmerge и mkvextract. Первая позволяет получить список потоков в контейнере:
mkvmerge -I
Формальной, для этой цели предназначена утилита mkvinfo из того же пакета, однако вывод mkvmerge лаконичней и гораздо лучше поддается парсингу. На выходе мы получим примерно такой список:
Track ID 1: video (V_MPEG4/ISO/AVC) [language:eng track_name:The\sMatrix\s1999\s1080p\sBluRay\sDD5.1\sx264-CtrlHD display_dimensions:1280x532 default_track:0 forced_track:0 packetizer:mpeg4_p10_video default_duration:41708332]
Track ID 2: audio (A_AC3) [language:rus track_name:DUB-Blu-ray default_track:1 forced_track:0 default_duration:32000000 audio_sampling_frequency:48000 audio_channels:6]Track ID 9: audio (A_DTS) [language:eng track_name:Original default_track:0 forced_track:0 default_duration:10666666 audio_sampling_frequency:48000 audio_channels:6]
Track ID 10: subtitles (S_TEXT/UTF8) [language:rus track_name:Sub default_track:0 forced_track:0]
Track ID 11: subtitles (S_TEXT/UTF8) [language:rus track_name:Sub-(по\s\2правильному\2\sпереводу\sГоблина) default_track:0 forced_track:0]
Track ID 12: subtitles (S_TEXT/UTF8) [language:eng track_name:Sub default_track:0 forced_track:0]
Track ID 13: subtitles (S_TEXT/UTF8) [language:eng track_name:Sub-SDH default_track:0 forced_track:0]
Нас интересуют потоки с типом subtitles и кодеком S_TEXT/UTF8, для которых нам нужен TrackID и код языка. Помимо S_TEXT/UTF8 мне встречались субтитры с кодировкой S_HDMV/PGS, но это птица редкая, требует она конвертации в srt, и поэтому субтитры такого типа мы рассматривать не будем. Заинтересовавшимся предлагают обратить внимание на утилиту BDSup2Sub.
Для непосредственного извлечения потока используем:
mkvextract tracks :
Первые два параметра (TrackID и имя файла-контейнера) довольно очевидны, а вот с третьим — именем для файла с субтитрами — все немного сложнее. Здесь необходимо ненадолго прерваться и ознакомиться с правилами именования внешних субтитров в Plex.
Согласно приведенной спецификации, имя субтитров должно иметь формат
..srt,
где должно совпадать с именем основного медиафайла. Подвох в том, что такая схема именования запрещает иметь несколько внешних субтитров для одного языка. К счастью, есть небольшая лазейка - если не соответствует ни одному языку, то субтитры все равно будут импортированы с пометкой, что язык неизвестен (и таких субтитров может быть сколько угодно). Мы поступим следующим образом: будем пытаться извлечь субтитры в соответствии с правилами наименования, а если такой файл уже существует - просто припишем к число. Не слишком удобно, однако лучше, чем ничего.
Откроем файл extractor.sh и напишем там следующее:
#!/bin/bash if [[ "$1" != *.mkv ]]; then exit 0; fi; FORMAT_FULL=".*ID[[:space:]]([[:digit:]]+):[[:space:]]([[:alpha:]]+)[[:space:]]\((.*)\).*language:([[:alpha:]]+)"; FORMAT_SHORT=".*ID[[:space:]]([[:digit:]]+):[[:space:]]([[:alpha:]]+)[[:space:]]\((.*)\)"; baseName=$; requiredLangs=$(echo "$2" | tr "," "\n"); echo "$(date +"%D %T"): $baseName" >> /specshare/log.txt; counter=0; tracks=$(mkvmerge -I "$1"); while read -r track; do echo -e "$(date +"%D %T"): $track" >> /specshare/log.txt; if [[ $track =~ $FORMAT_FULL ]]; then tType=$; lang=$; codec=$; else if [[ $track =~ $FORMAT_SHORT ]]; then tType=$; codec=$; lang="unk"; else fi fi; langMatch=false; idMatch=false; typeMatch=false; codecMatch=false; shouldExtract=false; for reqLang in $requiredLangs; do [ "$reqLang" == "$lang" ] && langMatch=true; done [ "$tType" == "subtitles" ] && typeMatch=true; [ "$codec" == "S_TEXT/UTF8" ] && codecMatch=true; [ $id -ne -1 ] && idMatch=true; $langMatch && $idMatch && $typeMatch && $codecMatch && shouldExtract=true; if $shouldExtract ; then subName="$baseName.$lang.srt" if [ -f "$subName" -o "$lang" == "unk" ]; then subName="$baseName.$lang$counter.srt"; (( counter++ )); fi mkvextract tracks "$1" $id:"$subName"; fi done
Алгоритм прост: мы запрашиваем список потоков, каждый из них разбираем регуляркой и, при выполнении условий для типа/кодека/языка, извлекаем файл. К сожалению, мне не удалось заставить работать квантификаторы для capturing groups в POSIX-версии регекспов, поэтому ситуация, когда язык для субтитров отсутствует, обрабатывается отдельной версией регулярного выражения. Буду рад советам на тему того, как это поправить.
Итак, у нас есть видеофайл и пачка распакованных субтитров. Пора переходить к завершающей стадии - импорту всего этого в Plex.
Обновлением медиатеки
Консольный метод
- возможны проблемы с использованием подключаемых библиотек;
- сканирование необходимо запускать из-под того же пользователя, из-под которого работает сам PMS;
Метод с GET-запросом
Веб-панель PMS, помимо предоставления UI для управления медиатекой, позволяет использовать GET-запросы к определенным URL для запуска сканирования. Для этого URL должен иметь следующий вид:
http://:32400/library/sections//refresh

где sectionId - номер соответствующей секции медиатеки в базе PMS. Чтобы его узнать, достаточно зайти в нужный раздел в веб-интерфейсе и посмотреть на содержимое адресной строки
В моем случае номер секции для фильмов - 3.
Теперь, когда мы знаем адрес, откроем снова deluge-movie-callback.sh и добавим в конец что-то вроде
wget -qO - http://192.168.13.1:32400/library/sections/3/refresh >> /dev/null ;
Можно добавить к URL параметры ?deep=1 или ?force=1 для более тщательного сканирования.
У нас готовы оба скрипта, осталось дать им права на запуск и добавить deluge-movie-callback.sh в настройки Execute. Этот процесс уже рассматривался, так что я не буду заострять на нем внимание.
- Перед вводом в эксплуатацию тщательно протестируйте скрипты на нескольких небольших раздачах. Эмоции, которые испытываешь, проснувшись утром и обнаружив, что немного опечатался в условии и весь жесткий диск забит извлеченными видео- и аудиодорожками, не передать цензурными словами.
- Извлечение субтитров - процедура тяжелая и ресурсоемкая, и весьма ощутимо сказывается на производительность всей системы. Хорошо подумайте, прежде чем извлекать из файлов всю начинку.
- Если в Deluge настроено автоматическое перемещение файлов после окончания загрузки, то вызов скрипта будет осуществляться после перемещения, и в параметрах будет новый путь. Это также верно при использовании плагина Label.
- Я не стал уделять много внимания вопросу прав на скрипты, ограничившись правами на запуск, но на практике необходимо убедиться, что пользователь, из под которого запущен демон deluged, имеет необходимые права на доступ к соответствующим файлам. Проще всего это проверить, переключившись c помощью sudo su - и попытавшись провести тест из консоли.
Трехшаговое руководство по удалению субтитров из видеофайлов MKV
Я получаю много MKV-файлов с онлайн-сайтов. Но я считаю, что некоторые из субтитров этих файлов MKV не синхронизируются с видео. Это действительно головная боль, чтобы нести субтитры. Есть ли хорошие способы удалить субтитры из MKV? »- Дженнис

Если вы также страдаете от той же проблемы, что и Дженнис, тогда вы попали по адресу. Несинхронизированные субтитры с видео заставят вас извлечь субтитры из видео, Этот туториал покажет вам самый простой способ удаления субтитров из MKV.
Для извлечения субтитров из MKV вам понадобится один инструмент, Видео конвертер Ultimate, который является экстрактором субтитров из MKV, MP4 и других видеофайлов.
- Извлечение субтитров из MKV, MP4, AVI, DVD и т. Д.
- Пакетное удаление субтитров из видео файлов.
- Добавьте подходящие субтитры к вашему видео.
- Обрежьте видео, чтобы избавиться от части субтитров из вашего фильма MKV.
- Свободно конвертируйте и редактируйте видео и аудио файлы.
- Часть 1. Как удалить несинхронизированные субтитры из MKV в три этапа
- Часть 2. Как извлечь субтитры с жестким кодом для получения четкого изображения на экране
Часть 1. Как удалить несинхронизированные субтитры из MKV в три этапа
Шаг 1, После установки этого программного обеспечения нажмите «Добавить файлы" загружать MKV файл с субтитрами.
Шаг 2, В раскрывающемся списке «Субтитры» установите флажок «Субтитры отключены".
Шаг 3, Нажмите "Конвертировать всеmsgstr "чтобы начать перемещать субтитры из файла MKV.

![]()
Легко, правда? После удаления несинхронизированных субтитров из вашего видео вы также можете скачать субтитры правильно для ваших файлов MKV с некоторых онлайн-сайтов и добавьте его в видеофайл с помощью Video Converter Ultimate, нажав зеленую кнопку «плюс» из варианта Sub.
Часть 2. Как извлечь субтитры с жестким кодом для получения четкого изображения на экране
Если вам просто не нравится субтитр, и вы думаете, что субтитр со словами будет мешать вашему просмотру этого файла MKV, или субтитр является жестким кодом и не может быть извлечен с помощью программного обеспечения, то вы можете использовать функцию кадрирования, чтобы удалить часть субтитры из файла MKV.
Шаг 1 По-прежнему запускайте Video Converter Ultimate на своем компьютере.
Шаг 2 Откройте файл MKV, нажмите «Редактировать»> «Повернуть и кадрировать», чтобы начать обрезку видео.
Шаг 3 Перетащите рамку или установите значение размера области обрезки, чтобы вырезать часть с субтитрами из видео. Нажмите «ОК»> закройте окно> «Конвертировать все», чтобы начать обрезку файла MKV.

Таким образом, вы также можете удалить субтитры из файла MKV. Но это может также извлечь некоторые части из всего движения, если вы не возражаете против эффектов видения фильма.
К настоящему времени в трехшаговом руководстве, которое поможет вам удалить субтитры из MKV, уже есть два способа. Вы можете выбрать предпочтительный метод, как вам нравится.
Если вы смотрите фильм на Apple TV, но не хотите видеть субтитры, просто прочитайте этот пост на включить Apple TV субтитры.
Расширенное чтение: как скачать и добавить субтитры к видео
Вы знаете, все относительно, иногда нам нужно найти и загрузить субтитры к некоторым видео, и что нам тогда делать? Вы можете скачать субтитры и добавить субтитры в MP4 или другие форматы видео с тем же программным обеспечением. Шаги довольно просты, и мы также предоставляем детали для вас, чтобы легко выполнить эту задачу.
Что вы думаете об этом посте.
Рейтинг: 4.8 / 5 (на основе голосов 200)
24 декабря 2020 г. 10:39 / Обновлено Дженни Райан в Конвертировать видео
Более Чтение
![]()
Оставьте свой комментарий и присоединяйтесь к нашему обсуждению
Главная Конвертировать видео Удалить субтитры из MKV

Авторские права © 2024 Aiseesoft Studio. Все права защищены.
Достаём субтитры из файлов формата .mkv/Matroska
[Обновлено] Первый и второй способ (второй проще).
Сегодня я наконец заполучил редкий релиз аниме «Железный Человек: Восстание Техновора» (2013) с двумя озвучками на русском и одной на оригинальном — японском — языке, а также русскими субтитрами. Однако оказалось, что субтитры в этом релизе соответствуют одноголосой (а не многоголосой) озвучке, которая вдобавок использует не всегда правильный перевод. Так, в конце 16-ой минуты Наташа говорит Тони, что Фьюри приказал сопроводить его на геликарриер, однако в субтитрах для этого используется слово «вертолёт». Мне захотелось отредактировать субтитры (найти отдельно их не удалось), и после недолгих поисков мною был найден следующий способ:
- Скачиваем и устанавливаем программу MKVToolNix с официального сайта (я выбрал вариант «Installer 64-bit»);
- Перебрасываем нужный нам файл в папку с программой;
- Нажимаем Windows и в поиск вводим cmd;
- Запускаем предложенный файл cmd. exe;
- Задаём команду X: , где X — буква диска, на котором установлена программа);
- Задаём команду CD X:\directory , где directory — путь к папке с программой. Например, в моём случае это F:\Apps\MKVToolNix;
- Задаём команду mkvmerge -i X. mkv , где X — название файла.
[Обновлено] При установке программа рекомендует два графических интерфейса, о чём мне напомнили в комментариях под этим постом. Мне больше всего понравился gMKVExtractGUI, который выводит подробные сведения о содержимом файла:
- Скачиваем и устанавливаем программу MKVToolNix с официального сайта (я выбрал вариант «Installer 64-bit»);
- Скачиваем и распаковываем архив с gMKVExtractGUI в папку с MKVToolNix;
- Запускаем gMKVExtractGUI. exe — у вас должна автоматически определиться папка с MKVToolNix;
- Перетаскиваем нужный .mkv-файл в центральное белое окно программы;
- Галочкой отмечаем нужные субтитры;
- В строке Output Directory ниже указываем, куда извлечь их;
- Нажимаем Extract в правом нижнем углу и дожидаемся окончания процесса извлечения. Готово!
P. S. Интересный факт — в английском дубляже Карателя в этом аниме озвучил Норман Ридус, а Джарвиса и Соколиного Глаза — Трой Бейкер.
Хитрые субтитры
Я начал смотреть фильмы на английском языке с английскими же субтитрами. И немедленно столкнулся с проблемой. Если народ на экране начинает активно тараторить, то субтитры слишком быстро исчезают с экрана. Я за ними не успеваю. Приходится не только всё время останавливать просмотр, но и постоянно отматывать фильм на несколько секунд назад. А иногда и вперёд. Когда говорят длинными фразами, фразы на экран целиком не влезают, смысл сказанного начинает теряться, хочется видеть фразу целиков, в том числе и то, что ещё не сказано.
Т.е. на экране что-то вот такое:

А хочется, чтобы было вот так:

Уговорить подвернувшиеся под руку видеоплееры показывать субтитры так, как мне того хочется, я не сумел. Но вспомнил, что обычно субтитры - это всего лишь небольшие текстовые файлы. И, значит, их можно слегка преобразовать и получить на экране ровно то, что хочется.
Алгоритм прост. Текущая фраза (текущий субтитр) выводится зелёным. Над ним - три предыдущих субтитра. Под ним - один следующий.
Как получить субтитры в "моём" формате? Всё очень просто. Находите файл с субтитрами с расширением .srt, запихиваете его в форму вверху страницы и жмёте кнопочку "Конвертировать".
Разница в отображении субтитров (другой размер шрифта, выравнивание по левому краю, отображение не на прозрачном, а на чёрном фоне) - это не моя работа с субтитрами, это настройки видеоплеера (плеер, который вы видите на скриншотах - это MPC-HC).
ЧАВО
- Что делать, если у меня субтитры не в формате .srt, а в каком-то другом формате?
- Сконвертировать их в .srt. Существуют всевозможные онлайн-конвертеры. Например, вот этот.
- Что делать, если у меня видеофайл с расширением .mkv и субтитры "зашиты" внутри этого файла?
- Извлечь субтитры из .mkv можно, но придётся немного повозиться. Скачайте MKVToolNix (я скачивал portable-версию). Скачайте MKVExtractGUI-2 и распакуйте в ту же папку. Запустите MKVExtractGUI2.exe, откройте с его помощью видеофайл, найдите нужную дорожку с субтитрами (subtitles), нажмите Extract.
- Зачем выводить субтитры на чёрном фоне?
- Это для ABBYY Lingvo x6. Можно подвести курсор мышки к слову из субтитров - и немедленно получить перевод. Очень удобно, не надо вводить слово в словарь (вроде бы работает не во всех видеоплеерах, но с MPC-HC проблем нет). Если же субтитры выводить на прозрачном фоне, то Lingvo не справляется с распознаванием слов.
Замечания, дополнения, сообщения об ошибках и плюшки с благодарностью принимаются.
Георгий Киселёв