Extrahieren von Untertiteln aus MKV-Dateien mit ffmpeg oder mplayer

3

Eine MKV-Datei mit mehreren Untertitelsätzen kann nicht auf SmartTV-Geräten oder ähnlichen Geräten abgespielt werden, da überhaupt keine Untertitel angezeigt werden. mplayer verwaltet die Datei ohne Probleme. Folgendes ist in der Datei enthalten:

$ 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

Ich gehe davon aus, dass weniger fähige Player andere Untertitelformate als SRT nicht verarbeiten können. Die Frage ist, wie man den vorhandenen englischen Untertiteltrack aus der MKV-Datei extrahiert, in SRT konvertiert und optional wieder in die MKV-Datei hinzufügt.

Abgesehen von "Ich habe noch nie eine MP4-Datei mit SRT-Untertiteln gesehen" wurde ein anderer Thread ( Konvertieren von DVD-Untertiteln in Text ), der dieselbe Frage stellte, nicht beantwortet.

Die angeblich definitive https://trac.ffmpeg.org/wiki/ExtractSubtitles enthält Informationen, die nicht mit der tatsächlichen ffmpeg-Operation übereinstimmen. Das ist mein 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

Und das habe ich versucht, ohne Erfolg:

$ 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 )

Der dvdsub-Decoder wird also wie erwartet in ffmpeg kompiliert (oder die Untertitel werden im mplayer nicht angezeigt), aber nicht aufgerufen, um sie zu konvertieren.

Ich habe es auch versucht

$ 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
...

Es wird der richtige Untertitel-Stream abgespielt, es wird jedoch nichts in die Datei subs-EN.srt geschrieben.

Was mache ich falsch?

Edward Sternin
quelle
Aha. Vielen Dank. Zusammenfassend ist "dvdsub" kein textbasiertes Untertitelformat (überraschend, weil ich die Schriftart ändern kann, die zum Rendern verwendet wird) und OCR zum Konvertieren in srt benötigt. Es kann jedoch als Überlagerung für das Video "eingebrannt" werden. Leider funktioniert keiner der beiden Befehle, die Sie dort anbieten, sehr gut: ffmpeg -i input.mkv -vf subtitles = input.mkv -acodec copy -sn convert.mkv oder ffmpeg -i input.mkv -filter_complex "[0: v : 0] [0: 2] Overlay "-acodec copy -sn conversion.mkv
Edward Sternin
ffmpeg -i input.mkv -vf subtitles = input.mkv -acodec copy -sn converter.mkv beschwert sich über keinen solchen Filter: 'subtitles', während ffmpeg -i input.mkv -filter_complex "[0: v: 0] [0: 2 ] Overlay "-acodec copy -crf 20 -sn converted.mkv erzeugt eine Ausgabe in schrecklicher Qualität.
Edward Sternin
schlechte Ausgabequalität -> der Untertitelteil oder das ganze Bild? In letzterem Fall können die Bilder unberechenbare Sprites innerhalb ihrer Pixel und / oder in niedriger Auflösung aufweisen. Ich würde zuerst die OCR-Route für den Text vorschlagen. Der Untertitelfilter muss libasskompiliert / verknüpft sein.
Gyan
Das ganze Bild, alles blockig, als ob eine sehr begrenzte Videobandbreite. Tatsächlich hat das Hinzufügen von -crf 20 die Qualität nicht wesentlich verbessert, wenn überhaupt. Es gibt einige Sprites (?) In den Untertiteln, und ihre Auflösung ist ebenfalls schlecht, aber nicht kritisch. Ich muss sagen, Sie sind die einzige Person in einem Forum, die ffmpeg zu verstehen scheint, eine einzigartig eigenwillige Software. Vielen Dank für Ihre Geduld, aber Sie sind dem Rest von uns Lichtjahre voraus und versuchen, Schritt zu halten. Gibt es eine äquivalente Strategie innerhalb von mplayer / mencoder? Ich scheine seine Logik besser zu verstehen.
Edward Sternin