Извлечение субтитров из файлов MKV с помощью ffmpeg или mplayer

3204
Edward Sternin

Файл MKV, содержащий несколько наборов субтитров, отказывается воспроизводить их на SmartTV или подобных устройствах, вообще не видя субтитров. mplayer управляет файлом без проблем. Вот что в файле:

$ ffprobe input.mkv |& grep Stream Stream #0:0(zxx): Video: h264 (High), yuv420p(progressive), 716x360 [SAR 32:27 DAR 2864:1215], SAR 212:179 DAR 106:45, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default) Stream #0:1(spa): Audio: ac3, 48000 Hz, stereo, fltp, 224 kb/s (default) Stream #0:2(eng): Subtitle: dvd_subtitle, 720x480 (default) Stream #0:3(fre): Subtitle: subrip Stream #0:4(por): Subtitle: subrip 

Я предполагаю, что менее способные игроки не могут справиться с форматами субтитров, отличными от SRT. Вопрос в том, как извлечь существующую дорожку английских субтитров из файла MKV, преобразовать ее в SRT и, необязательно, добавить обратно в файл MKV.

Кроме «Я никогда не видел MP4-файл с субтитрами SRT», другой поток ( Преобразование субтитров DVD в текст ), который задал тот же вопрос, не получил ответа.

Предположительно окончательный https://trac.ffmpeg.org/wiki/ExtractSubtitles содержит информацию, которая не соответствует фактической операции ffmpeg. Это мой ffmpeg:

$ ffmpeg -v ffmpeg version 3.3 Copyright (c) 2000-2017 the FFmpeg developers built with gcc 7.1.0 (GCC) configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/man --disable-static --enable-shared --enable-runtime-cpudetect --enable-avresample --enable-gpl --enable-version3 --enable-pthreads --enable-postproc --disable-debug --disable-indev=jack --disable-outdev=jack --arch=x86_64 --enable-pic --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-gnutls --enable-libcaca --enable-libcdio --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvorbis --enable-libvpx --enable-libmp3lame --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libpulse --enable-libsmbclient --enable-libwavpack libavutil 55. 58.100 / 55. 58.100 libavcodec 57. 89.100 / 57. 89.100 libavformat 57. 71.100 / 57. 71.100 libavdevice 57. 6.100 / 57. 6.100 libavfilter 6. 82.100 / 6. 82.100 libavresample 3. 5. 0 / 3. 5. 0 libswscale 4. 6.100 / 4. 6.100 libswresample 2. 7.100 / 2. 7.100 libpostproc 54. 5.100 / 54. 5.100 

И это то, что я пытался сделать без успеха:

$ ffmpeg -i input.mkv -map 0:2 subs-EN.srt ... Stream mapping: Stream #0:2 -> #0:0 (dvd_subtitle (dvdsub) -> subrip (srt)) Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height $ ffmpeg -codecs | grep dvdsub ... DES... dvd_subtitle DVD subtitles (decoders: dvdsub ) (encoders: dvdsub ) 

Таким образом, декодер dvdsub скомпилирован в ffmpeg (как и ожидалось, иначе субтитры не будут отображаться в mplayer), но не вызывается для их преобразования.

Я тоже пробовал

$ mplayer -dumpsrtsub -dumpfile subs-EN.srt -sid 0 input.mkv  MPlayer 1.3.0-7.1.0 (C) 2000-2016 MPlayer Team ... [lavf] stream 0: video (h264), -vid 0 [lavf] stream 1: audio (ac3), -aid 0, -alang spa [lavf] stream 2: subtitle (dvdsub), -sid 0, -slang eng [lavf] stream 3: subtitle (srt), -sid 1, -slang fre [lavf] stream 4: subtitle (srt), -sid 2, -slang por ... 

Правильный поток субтитров воспроизводится, но ничего не записывается в subs-EN.srt.

Что я делаю неправильно?

3
См. Http://stackoverflow.com/a/36327919/5726027 Gyan 6 лет назад 1
Понимаю. Благодарю. Подводя итог, можно сказать, что «dvdsub» не является форматом текстовых субтитров (удивительно, потому что я могу изменить шрифт, который используется для его рендеринга), и для его преобразования в srt требуется OCR. Тем не менее, это может быть "записано" как наложение на видео. К сожалению, из двух предложенных вами команд ни одна из них не работает очень хорошо: ffmpeg -i input.mkv -vf subtitles = input.mkv -acodec copy -sn convert.mkv или ffmpeg -i input.mkv -filter_complex "[0: v : 0] [0: 2] overlay "-acodec copy -sn convert.mkv Edward Sternin 6 лет назад 0
** ffmpeg -i input.mkv -vf subtitles = input.mkv -acodec copy -sn convert.mkv ** жалуется, что нет такого фильтра: 'subtitles' while ** ffmpeg -i input.mkv -filter_complex "[0: v: 0] [0: 2] overlay "-acodec copy -crf 20 -sn convert.mkv ** выдает ужасное качество вывода. Edward Sternin 6 лет назад 0
* ужасное качество вывода * -> часть субтитров или вся картинка? Если последнее, изображения могут иметь своенравные спрайты в пределах своих пикселей и / или низкого разрешения. Я хотел бы предложить OCR маршрут к тексту в первую очередь. Фильтр субтитров требует компиляции / компоновки `libass`. Gyan 6 лет назад 0
Целое изображение, все блочное, как будто очень ограниченная пропускная способность видео. На самом деле, добавление ** - crf 20 ** не сильно улучшило качество, если оно вообще было. В субтитрах есть некоторые спрайты (?), И их разрешение также плохое, но не критическое. Я должен сказать, что вы единственный человек на любом форуме, который, кажется, понимает ffmpeg, уникальное программное обеспечение. Спасибо за ваше терпение, но вы на несколько лет опережаете нас, стараясь не отставать. Есть ли в mplayer / mencoder эквивалентная стратегия? Кажется, я лучше понимаю его логику. Edward Sternin 6 лет назад 0
Кодирует ли та же команда без наложения приемлемое качество? Если да, получите сборку с помощью libass и попробуйте фильтр субтитров. Если не хорошо, OCR - единственный оставленный путь. `mplayer`, оригинал, так же хорош, как и открытая программа, и я думаю, он использует тот же декодер для dvdsub. Gyan 6 лет назад 0
У FFmpeg было слишком много поваров. Это 17-летний проект FOSS с взломами, обходными путями, приспособлениями для устаревшего API и ABI .. и т. Д. Так что это не удивительно. Многие из кодеков, которые он реализует, являются проприетарными (реинжиниринг) или, если они стандартизированы, имеют проприетарные варианты в дикой природе. Я подозреваю, что другие старые проекты FOSS с такими же большими и разнообразными областями также будут иметь эти проблемы Gyan 6 лет назад 0
Я решил свою непосредственную проблему, найдя файл .srt английских субтитров в Интернете. У меня проблемы с поиском пакета Slackware, поэтому нужно скомпилировать его с нуля; Это может занять некоторое время, и мотивация исчезла, так как это кажется тупиковым повышением. Еще раз спасибо за ваши полезные предложения, [https://superuser.com/users/114058/mulvya] Edward Sternin 6 лет назад 0

0 ответов на вопрос