it-swarm.com.de

Konvertieren von DVD-Bildern mit Untertiteln in MKV mit avconv

Ich kenne folgende Vorgehensweise, um ein DVD-Image in ein anderes Videoformat (z. B. MP4) zu konvertieren:

  1. verketten die VTS_01_ n .VOB Dateien in VIDEO_TS Ordner (für n > = 0) in eine einzelne VOB Datei.
  2. verwenden Sie avconv oder ffmpeg, um VOB in ein anderes Format zu konvertieren.

Soweit so gut, aber jetzt möchte ich das DVD-Image konvertieren mit den Untertiteln. Soweit ich weiß, unterstützt das MKV-Format Untertitel, so dass es eine naheliegende Wahl zu sein scheint. Alternativ kann ich auch ein anderes Format mit harten Untertiteln verwenden (Untertitel als Teil des Videobildes).

Die Untertitelkodierung im DVD-Image lautet jedoch dvdsub und es wird die folgende Fehlermeldung angezeigt

Only SUBTITLE_ASS type supported.
Subtitle encoding failed

Wenn Sie jedoch avconv -codecs Ich bekomme:

...
 DES    dvdsub          DVD subtitles
...

Und die -c:s copy wechseln, obwohl es verhindert, dass der Befehl fehlschlägt, scheint es keinen Untertitel zu geben, den der Spieler verstehen kann.

Also, wie kann ich ass Untertitel aus dvdsub mit avconv erstellen?

Meine VOB Datei hat acht Untertitelkanäle und zwei Audiokanäle. Die Ubuntu-Video-App zeigt keine Untertitel an und nur der erste Audiokanal scheint zu funktionieren, wenn das DVD-Image beschädigt ist.

Eine andere Datei für eine Double-Layer-DVD zeigt den Untertitelkodierungsfehler an, jedoch bei Verwendung von -c:s copy weitere anzeigen schalten:

Application provided invalid, non monotonically increasing dts to muxer in stream 2: 49 >= 49
av_interleaved_write_frame(): Invalid argument

Vielen Dank im Voraus für Ideen zur Lösung dieser Probleme.

(Ich verwende Ubuntu, wobei ffmpeg ein Alias ​​für avconv ist. Ich weiß, dass es möglich ist, das echte ffmpeg zu installieren, aber bisher habe ich es nicht getan.)


update: Befehle und Konsolenausgaben:

befehle

cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB VTS_01_5.VOB > ~/temp/mymovie.VOB
cd ~/temp
avconv -i mymovie.VOB

ausgabe

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers
  built on Mar 30 2013 22:20:06 with gcc 4.7.2
[mpeg @ 0x1a64d40] max_analyze_duration reached
Input #0, mpeg, from 'mymovie.VOB':
  Duration: 00:00:01.95, start: 0.280633, bitrate: -2147483 kb/s
    Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 7500 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0.1[0x20]: Subtitle: dvdsub
    Stream #0.2[0x21]: Subtitle: dvdsub
    Stream #0.3[0x22]: Subtitle: dvdsub
    Stream #0.4[0x23]: Subtitle: dvdsub
    Stream #0.5[0x24]: Subtitle: dvdsub
    Stream #0.6[0x25]: Subtitle: dvdsub
    Stream #0.7[0x26]: Subtitle: dvdsub
    Stream #0.8[0x27]: Subtitle: dvdsub
    Stream #0.9[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
    Stream #0.10[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
At least one output file must be specified

befehl

avconv -i mymovie.VOB mymovie.mkv

ausgabe

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers
  built on Mar 30 2013 22:20:06 with gcc 4.7.2
[mpeg @ 0x1cdad40] max_analyze_duration reached
Input #0, mpeg, from 'mymovie.VOB':
  Duration: 00:00:01.95, start: 0.280633, bitrate: -2147483 kb/s
    Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 7500 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0.1[0x20]: Subtitle: dvdsub
    Stream #0.2[0x21]: Subtitle: dvdsub
    Stream #0.3[0x22]: Subtitle: dvdsub
    Stream #0.4[0x23]: Subtitle: dvdsub
    Stream #0.5[0x24]: Subtitle: dvdsub
    Stream #0.6[0x25]: Subtitle: dvdsub
    Stream #0.7[0x26]: Subtitle: dvdsub
    Stream #0.8[0x27]: Subtitle: dvdsub
    Stream #0.9[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
    Stream #0.10[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
File 'mymovie.mkv' already exists. Overwrite ? [y/N] y
[buffer @ 0x1ce23c0] w:720 h:480 pixfmt:yuv420p
Output #0, matroska, to 'mymovie.mkv':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 29.97 tbc
    Stream #0.1: Audio: libvorbis, 48000 Hz, 5.1, s16
    Stream #0.2: Subtitle: ass, 200 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg2video -> mpeg4)
  Stream #0:9 -> #0:1 (ac3 -> libvorbis)
  Stream #0:1 -> #0:2 (dvdsub -> ass)
Press ctrl-c to stop encoding
[ass @ 0x1ce0140] Only SUBTITLE_ASS type supported.
Subtitle encoding failed

befehl

avconv -i mymovie.VOB -c:s copy mymovie.mkv

ausgabe entfällt.

befehl

avconv -i mymovie.mkv

ausgabe

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers
  built on Mar 30 2013 22:20:06 with gcc 4.7.2
[matroska,webm @ 0xbc1d40] Estimating duration from bitrate, this may be inaccurate
Input #0, matroska,webm, from 'mymovie.mkv':
  Metadata:
    ENCODER         : Lavf53.21.1
  Duration: 01:05:09.47, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: mpeg4 (Simple Profile), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 29.97 fps, 29.97 tbr, 1k tbn, 30k tbc (default)
    Stream #0.1: Audio: vorbis, 48000 Hz, 5.1, s16 (default)
    Stream #0.2: Subtitle: dvdsub (default)
At least one output file must be specified

Nun zum Double-Layer: Befehle

cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB VTS_01_5.VOB VTS_01_6.VOB VTS_01_7.VOB VTS_01_8.VOB > ~/temp/mylongmovie.VOB
cd ~/temp
avconv -i mylongmovie.VOB mylongmovie.mkv

ausgabe

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers
  built on Mar 30 2013 22:20:06 with gcc 4.7.2
[mpeg @ 0x13c2d40] max_analyze_duration reached
Input #0, mpeg, from 'Cosmos-0203.VOB':
  Duration: 00:00:30.24, start: 0.280633, bitrate: 2103365 kb/s
    Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 8000 kb/s, 27.46 fps, 59.94 tbr, 90k tbn, 59.94 tbc
    Stream #0.1[0x20]: Subtitle: dvdsub
    Stream #0.2[0x21]: Subtitle: dvdsub
    Stream #0.3[0x22]: Subtitle: dvdsub
    Stream #0.4[0x23]: Subtitle: dvdsub
    Stream #0.5[0x24]: Subtitle: dvdsub
    Stream #0.6[0x25]: Subtitle: dvdsub
    Stream #0.7[0x26]: Subtitle: dvdsub
    Stream #0.8[0x27]: Subtitle: dvdsub
    Stream #0.9[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
    Stream #0.10[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
File 'mylongmovie.mkv' already exists. Overwrite ? [y/N] y
[buffer @ 0x13ca3c0] w:720 h:480 pixfmt:yuv420p
Output #0, matroska, to 'mylongmovie.mkv':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 59.94 tbc
    Stream #0.1: Audio: libvorbis, 48000 Hz, 5.1, s16
    Stream #0.2: Subtitle: ass, 200 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg2video -> mpeg4)
  Stream #0:9 -> #0:1 (ac3 -> libvorbis)
  Stream #0:1 -> #0:2 (dvdsub -> ass)
Press ctrl-c to stop encoding
[ass @ 0x13d19c0] Only SUBTITLE_ASS type supported.
Subtitle encoding failed

befehl

avconv -i mylongmovie.VOB -c:s copy mylongmovie.mkv 

ausgabe

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers
  built on Mar 30 2013 22:20:06 with gcc 4.7.2
[mpeg @ 0xce1d40] max_analyze_duration reached
Input #0, mpeg, from 'mylongmovie.VOB':
  Duration: 00:00:30.24, start: 0.280633, bitrate: 2103365 kb/s
    Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 8000 kb/s, 27.46 fps, 59.94 tbr, 90k tbn, 59.94 tbc
    Stream #0.1[0x20]: Subtitle: dvdsub
    Stream #0.2[0x21]: Subtitle: dvdsub
    Stream #0.3[0x22]: Subtitle: dvdsub
    Stream #0.4[0x23]: Subtitle: dvdsub
    Stream #0.5[0x24]: Subtitle: dvdsub
    Stream #0.6[0x25]: Subtitle: dvdsub
    Stream #0.7[0x26]: Subtitle: dvdsub
    Stream #0.8[0x27]: Subtitle: dvdsub
    Stream #0.9[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
    Stream #0.10[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
File 'mylongmovie.mkv' already exists. Overwrite ? [y/N] y
[buffer @ 0xce93c0] w:720 h:480 pixfmt:yuv420p
Output #0, matroska, to 'mylongmovie.mkv':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 59.94 tbc
    Stream #0.1: Audio: libvorbis, 48000 Hz, 5.1, s16
    Stream #0.2: Subtitle: dvdsub
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg2video -> mpeg4)
  Stream #0:9 -> #0:1 (ac3 -> libvorbis)
  Stream #0:1 -> #0:2 (copy)
Press ctrl-c to stop encoding
[matroska @ 0xce4b40] Application provided invalid, non monotonically increasing dts to muxer in stream 2: 49 >= 49
av_interleaved_write_frame(): Invalid argument

Kurze Antwort: Gehen Sie zu Abschnitt Vollständige Befehlszeile und laden Sie ffmpeg von dieser Site herunter.

Ursprünglich wollte ich mit avconv antworten, da (a) diese Antwort noch fehlt und (b) avconv auf Ubuntu-Systemen heutzutage die Standardeinstellung zu sein scheint. Allerdings scheint es derzeit zu fehlerhaft zu sein, um dies zu erreichen - zumindest für meine Testfälle.

ffmpeg setup

Da Sie entweder nach avconv oder ffmpeg fragen und ich gerade erfahren habe, dass avconv eine Gabelung von ffmpeg ist (siehe diese Antwort = für eine Diskussion), habe ich eine aktuelle Version von ffmpeg von diese Seite heruntergeladen, wie die oben genannte Antwort erklärt. Windows-Builds sind ebenfalls verfügbar. Für einen typischen aktuellen 64-Bit-Linux-Build wäre der direkte Link zu diese Seite . Es enthält tägliche Builds. Scrollen Sie also nach unten, bis Sie die neueste und beste Version sehen. Laden Sie sie herunter und entpacken Sie sie mit z. tar xzvf ffmpeg.static.64bit.2014-02-14.tar.gz. Der Vorteil eines statischen Builds besteht darin, dass er weniger oder keine Abhängigkeiten aufweist. Beim Entpacken der Tarfile wurden zwei neue ausführbare Dateien ffmpeg und ffprobe im aktuellen Verzeichnis erstellt.

Grundlegende Befehlszeile

Jetzt können wir dieses neueste ffmpeg verwenden, um alle Streams innerhalb des mymovie.vob* In ein anderes Format zu kopieren. Beispielsweise:

./ffmpeg -i mymovie.vob -c:v copy -c:a copy -c:s copy -map 0 mymovie.mkv

Diese Befehlszeile

  • liest aus der Eingabedatei ein -i filename
  • kopiert Videostreams darin -c:v copy
  • kopiert Audio-Streams darin -c:a copy
  • kopiert Untertitel darin -c:s copy
  • und anstatt nur den ersten von jedem zu benutzen, benutzt und kopiert es alle von ihnen -map 0
  • in die Ausgabedatei outputfile

Lassen Sie uns die obige Befehlszeile erweitern, um einige mögliche Fehler im Tool oder beschädigte Eingabedateien oder nur Einzelheiten zu .vob - Dateien zu umgehen.

Fehler umgehen Can't write packet with unknown timestamp

Fügen Sie die Optionen -fflags +genpts vor der Eingabedatei hinzu.

./ffmpeg -fflags +genpts -i mymovie.vob -c:v copy -c:a copy -c:s copy -map 0 mymovie.mkv

Optionen in ffmpeg wirken sich immer nur auf Eingabe- oder Ausgabedateien mit dem Namen after der aktuellen Option aus. Diese beiden Optionen müssen sich auf die Eingabedatei auswirken, sodass sie an erster Stelle stehen müssen.

Diese Problemumgehung wird in diesem Fehlerticket behandelt und hilft möglicherweise nicht in allen Fällen.

Einige oder alle Untertitel fehlen

Dies ist ein sehr typisches Verhalten bei der Verarbeitung von .vob - Dateien und wird in den ffmpeg FAQ behandelt. Videocontainer-Dateitypen wie .avi Oder .mp4 Oder .mkv Haben Header (Daten am Dateianfang), die den gesamten Inhalt der Datei auflisten. Auf diese Weise können Player und Konvertierungstools leicht erkennen, welche Daten zu erwarten sind. .vob - Dateien haben keinen solchen expliziten Header. Wenn also ffmpeg oder avconv beginnen, sehen sie sich die ersten paar tausend Bytes an. In VOB-Dateien können die Untertitel sehr spät beginnen. In meinem Testfall wird der erste Untertitel nach einigen Sekunden angezeigt, sodass die Tools ihn beim Start nicht sehen. Hier ist ein typisches Beispiel für die Ausgabe beim Codieren in diesen Situationen:

Output #0, matroska, to 'test.mkv':
  Metadata:
    encoder         : Lavf55.32.101
    Stream #0:0: Video: mpeg2video (mpg2 / 0x3267706D), yuv420p, 720x576 [SAR 64:45 DAR 16:9], q=2-31, max. 9800 kb/s, 25 fps, 1k tbn, 90k tbc
    Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), 448 kb/s
    Stream #0:2: Audio: dts ([1] [0][0] / 0x2001), 48000 Hz, 5.1(side), 768 kb/s
    Stream #0:3: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), 448 kb/s
    Stream #0:4: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, 224 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
  Stream #0:2 -> #0:2 (copy)
  Stream #0:3 -> #0:3 (copy)
  Stream #0:4 -> #0:4 (copy)
Press [q] to stop, [?] for help
[mpeg @ 0x31f2540] New subtitle stream 0:5 at pos:16945166 and DTS:22.2473s
[mpeg @ 0x31f2540] New subtitle stream 0:6 at pos:16951310 and DTS:22.2473s
[mpeg @ 0x31f2540] New subtitle stream 0:7 at pos:16957454 and DTS:22.2873s
[mpeg @ 0x31f2540] New subtitle stream 0:8 at pos:16963598 and DTS:22.2873s
[mpeg @ 0x31f2540] New subtitle stream 0:9 at pos:18405390 and DTS:25.4873s
[mpeg @ 0x31f2540] New subtitle stream 0:10 at pos:18417678 and DTS:25.4873s
[mpeg @ 0x31f2540] New subtitle stream 0:11 at pos:264593422 and DTS:288.207sts/s    
[mpeg @ 0x31f2540] New subtitle stream 0:12 at pos:264597518 and DTS:288.207s
frame=24694 fps=7322 q=-1.0 Lsize=  859345kB time=00:16:27.74 bitrate=7127.1kbits/s    
video:632823kB audio:224996kB subtitle:0 data:0 global headers:0kB muxing overhead 0.177935%

Wie man sieht, wurden während der eigentlichen Kodierung neue Untertitelströme gefunden. Wenn man versuchen würde, die Option -map 5 Hinzuzufügen, um diesen Stream einzuschließen, würde sich ffmpeg beim Start darüber beschweren, dass diese Stream-Nummer nicht existiert.

Die Lösung besteht darin, ffmpeg anzuweisen, am Anfang der Datei mehr Bytes zu analysieren, um alle Streams zu finden.

Versuchen Sie, die Optionen -analyzeduration 1000000k -probesize 1000000k vor der Eingabedatei hinzuzufügen.

Erhöhen Sie die Anzahl, wenn die Streams immer noch nicht gefunden werden. In meinen Testfällen waren diese Zahlen groß genug. Die Ausgabe ändert sich dann zu:

Input #0, mpeg, from 'mymovie.vob':
  Duration: 00:59:39.90, start: 0.287267, bitrate: 5915 kb/s
    Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, bt470bg), 720x576 [SAR 64:45 DAR 16:9], max. 9800 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x80]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s
    Stream #0:2[0x89]: Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 768 kb/s
    Stream #0:3[0x82]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s
    Stream #0:4[0x83]: Audio: ac3, 48000 Hz, stereo, fltp, 224 kb/s
    Stream #0:5[0x20]: Subtitle: dvd_subtitle
    Stream #0:6[0x21]: Subtitle: dvd_subtitle
    Stream #0:7[0x22]: Subtitle: dvd_subtitle
    Stream #0:8[0x23]: Subtitle: dvd_subtitle
    Stream #0:9[0x24]: Subtitle: dvd_subtitle
    Stream #0:10[0x25]: Subtitle: dvd_subtitle
    Stream #0:11[0x26]: Subtitle: dvd_subtitle
    Stream #0:12[0x27]: Subtitle: dvd_subtitle
File 'test.mkv' already exists. Overwrite ? [y/N] y
Output #0, matroska, to 'test.mkv':
  Metadata:
    encoder         : Lavf55.32.101
    Stream #0:0: Video: mpeg2video (mpg2 / 0x3267706D), yuv420p, 720x576 [SAR 64:45 DAR 16:9], q=2-31, max. 9800 kb/s, 25 fps, 1k tbn, 90k tbc
    Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), 448 kb/s
    Stream #0:2: Audio: dts ([1] [0][0] / 0x2001), 48000 Hz, 5.1(side), 768 kb/s
    Stream #0:3: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), 448 kb/s
    Stream #0:4: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, 224 kb/s
    Stream #0:5: Subtitle: dvd_subtitle
    Stream #0:6: Subtitle: dvd_subtitle
    Stream #0:7: Subtitle: dvd_subtitle
    Stream #0:8: Subtitle: dvd_subtitle
    Stream #0:9: Subtitle: dvd_subtitle
    Stream #0:10: Subtitle: dvd_subtitle
    Stream #0:11: Subtitle: dvd_subtitle
    Stream #0:12: Subtitle: dvd_subtitle

Vollständige Befehlszeile

./ffmpeg -fflags +genpts -analyzeduration 1000000k -probesize 1000000k -i mymovie.vob -c:v copy -c:a copy -c:s copy -map 0 mymovie.mkv

Jede der Kopien kann durch einen Codec ersetzt werden, um die Daten tatsächlich zu konvertieren und wahrscheinlich zu komprimieren. Wenn es sich jedoch nur um die drei Kopien handelt, kann der Befehl wie folgt vereinfacht werden:

./ffmpeg -fflags +genpts -analyzeduration 1000000k -probesize 1000000k -i mymovie.vob  -c copy -map 0 mymovie.mkv

Alle diese Optionen werden auch von avconv unterstützt. Dieses Tool scheint jedoch immer noch ein Problem mit einigen Untertiteln zu haben. Wenn Sie diesen Fehler sehen:

[matroska @ 0x383aee60] Application provided invalid, non monotonically increasing dts to muxer in stream 7: 58280 >= 58280
av_interleaved_write_frame(): Invalid argument

Sie können dieses Problem umgehen, indem Sie das neueste ffmpeg herunterladen und stattdessen dieses Tool verwenden, wie oben erläutert.

40
cfi

Wenn Sie eine qualitätssparende Lösung benötigen, sollten Sie versuchen MakeMKV .
Wenn Sie die Videospur komprimieren oder MPEG-2 nach H.264 konvertieren möchten, können Sie Handbremse verwenden.

4
Endoro