Untertitel aus MKV-Dateien mit ffmpeg oder mplayer extrahieren

3294
Edward Sternin

Eine MKV-Datei, die mehrere Untertitel enthält, kann nicht auf einem SmartTV oder ähnlichen Geräten abgespielt werden, da 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 Spieler andere Untertitelformate als SRT nicht verarbeiten können. Die Frage ist, wie man die vorhandene englische Untertitelspur aus der MKV-Datei extrahiert, in SRT konvertiert und sie optional in die MKV-Datei hinzufügt.

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

Der vermeintlich endgültige Befehl 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 in ffmpeg kompiliert (wie erwartet oder die Untertitel werden nicht in mplayer angezeigt), wird jedoch 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 ... 

Der richtige Untertitel-Stream wird abgespielt, aber es wird nichts in subs-EN.srt geschrieben.

Was mache ich falsch?

3
Siehe http://stackoverflow.com/a/36327919/5726027 Gyan vor 6 Jahren 1
Aha. Vielen Dank. Zusammenfassend ist "dvdsub" kein textbasiertes Untertitelformat (überraschend, da ich die Schriftart ändern kann, die zum Rendern verwendet wird) und OCR benötigt, um es in srt zu konvertieren. Es kann jedoch als Überlagerung des Videos "eingebrannt" werden. Leider funktioniert keiner der beiden Befehle, die Sie dort anbieten, sehr gut: ffmpeg -i input.mkv -vf Untertitel = input.mkv -acodec copy -sn convert.mkv oder ffmpeg -i input.mkv -filter_complex "[0: v : 0] [0: 2] Overlay "-acodec copy -sn convert.mkv Edward Sternin vor 6 Jahren 0
** ffmpeg -i input.mkv -vf Untertitel = input.mkv -acodec copy -sn convert.mkv ** beschwert Kein solcher Filter: "Untertitel" während ** ffmpeg -i input.mkv -filter_complex "[0: v: 0] [0: 2] Overlay "-acodec copy -crf 20 -sn convert.mkv ** erzeugt eine schreckliche Qualitätsausgabe. Edward Sternin vor 6 Jahren 0
* schreckliche Qualitätsausgabe * -> Untertitel oder das ganze Bild? In letzterem Fall können die Bilder in ihren Pixeln und / oder niedriger Auflösung Sprites aufweisen. Ich würde zuerst den OCR-Weg zum Text vorschlagen. Für den Untertitelfilter muss "libass" kompiliert / verlinkt werden. Gyan vor 6 Jahren 0
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 jedem Forum, die offenbar ffmpeg zu verstehen scheint, ein eigenartig idiosynkratisches Stück Software. Vielen Dank für Ihre Geduld, aber Sie sind dem Rest von uns Lichtjahre voraus und versuchen mitzuhalten. Gibt es eine gleichwertige Strategie in mplayer / mencoder? Ich scheine ihre Logik besser zu verstehen. Edward Sternin vor 6 Jahren 0
Kodiert derselbe Befehl ohne die Überlagerung in akzeptabler Qualität? Wenn ja, holen Sie sich ein Build mit libass und probieren Sie den Untertitelfilter. Wenn nicht gut, ist nur noch OCR verfügbar. "mplayer", das Original, ist so gut wie aufgegeben, und ich denke, es verwendet denselben Decoder für dvdsub. Gyan vor 6 Jahren 0
FFmpeg hatte zu viele Köche. Es ist ein 17 Jahre altes FOSS-Projekt mit Hacks, Workarounds, Unterkünften für ältere APIs und ABI .. etc. Es ist also nicht überraschend. Viele der von ihr implementierten Codecs sind proprietär (Reverse Engineering) oder, wenn sie standardisiert sind, proprietäre Varianten in freier Wildbahn. Ich vermute, dass auch andere alte FOSS-Projekte mit ähnlich großem und vielfältigem Umfang diese Probleme haben werden Gyan vor 6 Jahren 0
Ich habe mein unmittelbares Problem gelöst, indem ich eine .srt-Datei der englischen Untertitel im Internet gefunden habe. Ich habe Schwierigkeiten, ein Slackware-Paket zu finden. Ich muss also von Grund auf kompilieren. Es könnte eine Weile dauern, und die Motivation ist weg, da es eine Sackgasse ist. Nochmals vielen Dank für Ihre hilfreichen Vorschläge [https://superuser.com/users/114058/mulvya] Edward Sternin vor 6 Jahren 0

0 Antworten auf die Frage