[Entware] mkvtoolnix: вытаскиваем субтитры из "матрёшек"

Используем пакеты, расширяющие возможности оборудования
Аватара пользователя
Zyxmon
Администратор
Сообщения: 1232
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 16 июн 2016, 13:40

Многие предпочитают смотреть фильмы на языке оригинала, а перевод на русский видеть в виде субтитров. Или наоборот, смотреть фильм на русском, при этом субтитры должны быть на языке оригинала.
DLNA серверы (и в частности minidlna) передают на телевизор субтитры, если они называются как файл с видео, но имеют расширение srt.
В этом топике обсудим извлечение субтитров из файлов формата mkv (матрёшек) прямо на роутере или НАСе.

Для этого нам потребуется установить пакет mkvtoolnix
1. Установка

Код: Выделить всё

opkg update
opkg install mkvtoolnix

2. Определим, какие субтитры в нашем файле и номера дорожек с субтитрами.
Пусть в текущей директории находится файл `film.mkv`. Для получения инофмации о содержимом наберем

Код: Выделить всё

# mkvinfo film.mkv
 + EBML head
|+ EBML version: 1
|+ EBML read version: 1
|+ EBML maximum ID length: 4
|+ EBML maximum size length: 8
|+ Doc type: matroska
|+ Doc type version: 2
|+ Doc type read version: 2
+ Segment, size 1566655324
|+ Seek head (subentries will be skipped)
|+ EbmlVoid (size: 4029)
|+ Segment information
| + Timecode scale: 1000000
| + Muxing application: libebml v1.2.3 + libmatroska v1.3.0
| + Writing application: mkvmerge v5.8.0 ('No Sleep / Pillow') built on Sep  2 2012 15:37:04
| + Duration: 5740.745s (01:35:40.745)
| + Date: Sun Nov  3 07:47:09 2013 UTC
| + Segment UID: 0x9d 0x99 0xca 0xdb 0xae 0x09 0xf2 0x2d 0x8e 0x98 0xdb 0xbb 0x75 0x9c 0x1e 0xbb
|+ Segment tracks
| + A track
|  + Track number: 1
|  + Track UID: 933253873644806325
|  + Track type: video
|  + Lacing flag: 0
|  + MinCache: 1
|  + Codec ID: V_MPEG4/ISO/AVC
|  + Default duration: 41.708ms (23.976 fps for a video track)
|  + Language: und
|  + Video track
|   + Pixel width: 1016
|   + Pixel height: 432
|   + Display width: 1016
|   + Display height: 432
|  + CodecPrivate, length 55
| + A track
|  + Track number: 2
|  + Track UID: 11591896489833290887
|  + Track type: audio
|  + Codec ID: A_AAC
|  + CodecPrivate, length 5
|  + Default duration: 21.333ms (46.875 fps for a video track)
|  + Language: rus
|  + Name: Dub
|  + Audio track
|   + Sampling frequency: 48000
|   + Channels: 6
| + A track
|  + Track number: 3
|  + Track UID: 17185268996613977738
|  + Track type: audio
|  + Default flag: 0
|  + Codec ID: A_AAC
|  + CodecPrivate, length 5
|  + Default duration: 21.333ms (46.875 fps for a video track)
|  + Name: Original
|  + Audio track
|   + Sampling frequency: 48000
|   + Channels: 6
| + A track
|  + Track number: 4
|  + Track UID: 11385965893828870547
|  + Track type: subtitles
|  + Default flag: 0
|  + Lacing flag: 0
|  + Codec ID: S_TEXT/UTF8
|  + Language: rus
|  + Name: Full
| + A track
|  + Track number: 5
|  + Track UID: 17774564552554844580
|  + Track type: subtitles
|  + Default flag: 0
|  + Lacing flag: 0
|  + Codec ID: S_TEXT/UTF8
|  + Name: Full
|+ EbmlVoid (size: 1120)
|+ Chapters
| + EditionEntry
|  + EditionFlagHidden: 0
|  + EditionFlagDefault: 0
|  + EditionUID: 13936717882403376264
|  + ChapterAtom
|   + ChapterUID: 4940603363767436418
|   + ChapterTimeStart: 00:00:00.000000000
|   + ChapterFlagHidden: 0
|   + ChapterFlagEnabled: 1
|   + ChapterDisplay
|    + ChapterString: Chapter 1
|    + ChapterLanguage: eng
|  + ChapterAtom
....

Для сокращения объема выводимой информации (а нам нужно узнать номера дорожек с субтитрами) можно использовать grep:

Код: Выделить всё

# mkvinfo film.mkv | grep -E 'S_TEXT|number:|Language:|Name:'
|  + Track number: 1
|  + Language: und
|  + Track number: 2
|  + Language: rus
|  + Name: Dub
|  + Track number: 3
|  + Name: Original
|  + Track number: 4
|  + Codec ID: S_TEXT/UTF8
|  + Language: rus
|  + Name: Full
|  + Track number: 5
|  + Codec ID: S_TEXT/UTF8
|  + Name: Full
|    + ChapterLanguage: eng
|    + ChapterLanguage: eng
|    + ChapterLanguage: eng
....

Из выдач видно, что русские субтитры находятся в дорожке 4, а английские в 5.
3. Для извлечения субтитров воспользуемся утилитой mkvextract

Код: Выделить всё

mkvextract tracks film.mkv 4:film.srt

В результате рядом с файлом film.mkv очень быстро (даже на слабом роутере) получим файл с субтитрами film.srt
PS Если нужны английские субтитры, то заменим 4, на 5:

Код: Выделить всё

# mkvextract tracks film.mkv 5:film.eng.srt
Extracting track 5 with the CodecID 'S_TEXT/UTF8' to the file 'film.eng.srt'. Container format: SRT text subtitles
Progress: 100%

Это самый быстрый способ извлечения субтитров из всех мне известных (при условии, что фильм находится на usb носителе, который подключен к роутеру!

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1232
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 26 дек 2016, 16:00

В последних версиях mkvtoolnix изменилась "нумерация треков". Для информации о номере трека (Track ID) следует использовать `mkvmerge --identify-verbose` вместо mkvinfo в случае, если предполагается использовать mkvextract.
Подробнее - https://github.com/mbunkus/mkvtoolnix/w ... -IDs-wrong


Вернуться в «Entware/Qnapware/Optware/Zyxware - обсуждаем репозитории пакетов»

Кто сейчас на конференции

Всего 2 посетителя :: 1 зарегистрированный, 0 скрытых и 1 гость (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (121) здесь было 18 май 2016, 18:19

Сейчас этот форум просматривают: Yandex [Bot] и 1 гость