Untertitelspuren fangen alle an unterschiedlichen Stellen im Film an und werden deshalb von ffmpeg nicht gefunden

  • Hallo Leute,


    ich habe einen Film, der 6 Untertitelspuren hat.

    Vier davon fangen nach ca. 6,5 Sekunden an, eine nach über 19 Minuten und die letzte nach über 52 Minuten.

    Keine davon wird von ffmpeg, ffprobe oder mediainfo ausgewiesen bzw. bearbeitet.


    Auch nicht wenn ich mplayer nehme und den ersten Teil (mit "-ss 10") überspringen lasse.


    Hat einer ne Idee, wie man die komplette Anzahl der Untertitel (zuverlässig) ermitteln kann?


    FRAGEN:

    1. Wenn ich die richtige Anzahl der vorhandenen Untertitelspuren weiß, dann kann ich sie mit "vob2sub" extrahieren und dann dem ffmpeg separat übergeben...

    2. ...weiß einer, wie man solche Untertitel (die bestehen aus einer sub.sub und tausende BMP-Dateien) dem ffmpeg übergibt?


    Gruß

    Yoda

  • Ich glaube jetzt, dass das mit vob2sub der falsche Ansatz ist.


    Im Internet habe ich nur Möglichkeiten gefunden, wie man Textbasierte Untertitel (SRT oder ASS) mit ffmpeg verarbeiten kann. Diese sub.sub+BMP sind ja alles BMP-Grafiken... die kann man sicherlich auch nur schwer wieder in Text umwandeln.


    Deshalb brauche ich wohl eher ein Programm, mit dem man (genauso wie vob2sub es tut) die komplette Film-Datei durchläuft (dauert auch seine Zeit) und so wirklich alle Untertitel erwischt. Aber eben die Untertitel in einem Textformat wie SRT oder ASS ablegt.


    Hat einer ne Idee, mit welchen Programmen es geht?

    mplayer/mencoder vielleicht...? (aber wie)



    Gruß

    Yoda

  • Die Erkennbarkeit von Untertitelspuren hängt stark vom Containerformat ab. Es gibt Container, die haben Header, in denen sämtliche Inhalte aufgelistet sind, da wissen Player und Analysetools von vorn herein, was sie zu erwarten haben. Und es gibt andere Formate, bei denen die Player im Grunde alles so auf sich zu kommen lassen und allzeit bereit sein müssen, falls mal was auftaucht. In letzteren Bereich fällt z.B. der MPEG-TransportStream, der auch für Digitalfernseh-Übertragungen geeignet ist, wo damit zu rechnen ist, dass eine Wiedergabe plötzlich mitten in der Übertragung beginnt, wenn jemand z.B. den Sender wechselt.

  • Die Erkennbarkeit von Untertitelspuren hängt stark vom Containerformat ab. Es gibt Container, die haben Header, in denen sämtliche Inhalte aufgelistet sind, da wissen Player und Analysetools von vorn herein, was sie zu erwarten haben. Und es gibt andere Formate, bei denen die Player im Grunde alles so auf sich zu kommen lassen und allzeit bereit sein müssen, falls mal was auftaucht. In letzteren Bereich fällt z.B. der MPEG-TransportStream, der auch für Digitalfernseh-Übertragungen geeignet ist, wo damit zu rechnen ist, dass eine Wiedergabe plötzlich mitten in der Übertragung beginnt, wenn jemand z.B. den Sender wechselt.

    Ja, jetzt ist die Frage, welches Tool kann alle Untertitel erkennen? Leider kenne ich nur vob2sub mit diesen Eigenschaften, denn ich habe keine Möglichkeit gefunden, das Untertitel-Format von vob2sub mit ffmpeg zu verarbeiten bzw. in SRT oder ASS umzuwandeln...? :-(

  • eine andere Idee, die hatte...


    Mit vob2sub kann ich genau ermitteln, wann jede einzelne Untertitelspur beginnt.

    Dann bräuchte ich ein Tool, mit dem ich den Film genau an den entsprechenden Stellen teilen kann und dann einzeln transkodieren und zum Schluß wieder zusammensetzen...


    Aber ein Tool, mit dem ich einen Film so genau an beliebigen Stellen schneiden kann (ohne etwas zu verlieren), kenne ich auch nicht... :-(

  • Mag ja sein, dass MediaInfo nicht alle Untertitel erkannt hat.


    Aber ohne zu wissen, welche Formate MediaInfo erkannt hat, können wir dir keine weiteren Tipps geben. Schließlich hängt es ganz erheblich davon ab, welches Format deine Quelle hat, welche Tools damit umgehen könnten. Keine Ahnung - keine Hilfe.


    Nur vielleicht so was allgemeines: Wenn man ffmpeg so konfiguriert, dass es nicht nur den Anfang, sondern die gesamte Quelldatei untersucht, erkennt es auch alles, was drin steckt. Dann dauert es aber eine ganze Weile, bevor dann die eigentliche Umwandlung beginnt.

  • ...


    Nur vielleicht so was allgemeines: Wenn man ffmpeg so konfiguriert, dass es nicht nur den Anfang, sondern die gesamte Quelldatei untersucht, erkennt es auch alles, was drin steckt. Dann dauert es aber eine ganze Weile, bevor dann die eigentliche Umwandlung beginnt.

    Ohhh, das geht?

    Ich wusste das MEncoder das kann...

    Kannst Du mir bitte ein Beispiel für ffmpeg/ffprobe geben?


    Gruß

    Yoda

  • Mag ja sein, dass MediaInfo nicht alle Untertitel erkannt hat.


    Aber ohne zu wissen, welche Formate MediaInfo erkannt hat, können wir dir keine weiteren Tipps geben. Schließlich hängt es ganz erheblich davon ab, welches Format deine Quelle hat, welche Tools damit umgehen könnten. Keine Ahnung - keine Hilfe.


    ...

    Stimmt...


    Also es ist ein 1:1 - Rip von einer DVD (MPEG/VOB)


    Diese Spuren werden von mediainfo, ffmpeg und ffprobe erkannt (weil sie bei "0" beginnen):


    Code
    1. Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, progressive), 720x576 [SAR 64:45 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    2. Stream #0:1[0x80]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 384 kb/s
    3. Stream #0:2[0x81]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 384 kb/s


    weiterhin gibt es diese Untertitelspuren, die nicht erkannt werden:


    Code
    1. Sub-1 startet bei 6,56 Sekunden: sub0/sub0000.bmp 00:00:06,56 00:00:09,06 720 573 0 2 0 255 0 255
    2. Sub-2 startet bei 6,48 Sekunden: sub1/sub0000.bmp 00:00:06,48 00:00:07,42 720 573 0 2 0 255 0 255
    3. Sub-3 startet bei 6,48 Sekunden: sub2/sub0000.bmp 00:00:06,48 00:00:09,29 720 573 0 2 0 255 0 255
    4. Sub-4 startet bei 6,48 Sekunden: sub3/sub0000.bmp 00:00:06,48 00:00:09,29 720 573 0 2 0 255 0 255
    5. Sub-5 startet bei 52:22 Minuten: sub4/sub0000.bmp 13:15:21,85 00:52:22,49 720 573 0 2 0 255 0 255
    6. Sub-6 startet bei 19:21 Minuten: sub5/sub0000.bmp 13:15:21,85 00:19:21,26 720 573 0 2 0 255 0 255


    Hier die komplette Ausgabe von mediainfo:


  • Das sind die Kommandos, die ich verwende.


    Das hier funktioniert, hat aber keine Untertitel drin:

    Code
    1. /usr/local/bin/ffmpeg -fflags +genpts -i "Avengers_4_-_Endgame.mpg" -map 0:v -c:v libx264 -profile:v high -preset veryslow -tune film -x264opts ref=4:b-pyramid=strict:bluray-compat=1:weightp=0:vbv-maxrate=12500:vbv-bufsize=12500:level=3:slices=4:b-adapt=2:direct=auto:colorprim=bt709:transfer=bt709:colormatrix=bt709:keyint=50:aud:subme=9:nal-hrd=vbr -movflags faststart -crf 16 -vf scale=856x480,pad='max(iw\,ih*(16/9)):ow/(16/9):(ow-iw)/2:(oh-ih)/2',setsar='1/1' -keyint_min 2-8 -map 0:a:0 -c:a libfdk_aac -afterburner 1 -b:a 344k -map 0:a:1 -c:a libfdk_aac -afterburner 1 -b:a 344k -f mp4 -y ./Avengers_4_-_Endgame.mp4

    Das hier funktioniert nicht, weil er die Untertitel nicht findet:

    Code
    1. /usr/local/bin/ffmpeg -fflags +genpts -i "Avengers_4_-_Endgame.mpg" -map 0:v -c:v libx264 -profile:v high -preset veryslow -tune film -x264opts ref=4:b-pyramid=strict:bluray-compat=1:weightp=0:vbv-maxrate=12500:vbv-bufsize=12500:level=3:slices=4:b-adapt=2:direct=auto:colorprim=bt709:transfer=bt709:colormatrix=bt709:keyint=50:aud:subme=9:nal-hrd=vbr -movflags faststart -crf 16 -vf scale=856x480,pad='max(iw\,ih*(16/9)):ow/(16/9):(ow-iw)/2:(oh-ih)/2',setsar='1/1' -keyint_min 2-8 -map 0:a:0 -c:a libfdk_aac -afterburner 1 -b:a 344k -map 0:a:1 -c:a libfdk_aac -afterburner 1 -b:a 344k -map 0:s:0 -c:s copy -map 0:s:1 -c:s copy -map 0:s:2 -c:s copy -map 0:s:3 -c:s copy -map 0:s:4 -c:s copy -map 0:s:5 -c:s copy -f mp4 -y ./Avengers_4_-_Endgame.mp4

    Gruß

    Yoda

  • Oh je. Da schau mal, mit wie vielen Details du mich plötzlich überraschst.


    1) Wer mit einer DVD Video als Quelle arbeitet, sollte Konverter verwenden, die davon Ahnung haben. Insbesondere Ahnung von der logischen Struktur, die in den IFO-Dateien beschrieben ist. Für Windows-PC gibt es da einige.


    2) Du aber arbeitest unter Linux. Ach so. Tja, da kenne ich mich nicht aus. Vielleicht kann "Hybrid" von Selur dir bei allem Nötigen helfen. Angefangen damit, dass man von einer DVD Video nicht "alles 1:1" verarbeitet, sondern nur eine "Program Chain" (PGC) des Hauptfilms. Klingt, als müssten wir da einiges an Grundlagenwissen besprechen.

  • Ja, stimmt. Ich ziehe mir praktisch eine mögliche Version (nur einen Blickwinkel usw.) aber das reicht mir. Nur die Untertitel hätte ich noch gerne. In der Dokumentation vom Author von vob2sub ist nachzulesen, dass der MPEG-Container bis zu 32 Grafische Schichten für z.B. Untertitel unterstützt und davon machen die DVD-Leute auch reichlich Gebrauch.


    Kannst Du mir bitte noch sagen, wie man ffmpeg überreden kann, alles zu lesen?

    Danke!


    Welche Windows-Konverter würdest Du denn empfehlen (vorzugsweise für die Kommandozeile - ich weiß, die sind selten)?


    Gruß

    Yoda



    P.S.: Ach, Linux verwende ich nur nebenbei, hauptsächlich werden meine Filme auf FreeBSD transkodiert. :-)

  • Was die Auswahl an CLI-Software zur Konvertierung angeht, da würde ich eher auf Selur verweisen, der hat mehr praktische Erfahrung damit, welche plattformübergreifende Software verfügbar ist. Im Bereich "DVD rippen" fällt mir lediglich vStrip ein, davon müsste es auch mal eine CLI gegeben haben (als GUI würde ich sonst PGCDemux bevorzugen); aber das ist auch noch der eine nicht voll automatisierbare Schritt, denn DVD-Authoring ist so vielfältig, die Auswahl an PGC, Angle und Spuren muss manuell erfolgen. Optimal ist für meinen Geschmack, wenn man eine fortlaufende "PGC-VOB" mit Videospur und gewünschten Untertitelspuren hat (die kann VobSub / VSRip verarbeiten), und die Tonspuren dazu separat demultiplext wurden, um sie evtl. im Originalformat wieder in die Kopie zu übernehmen.


    Die CLI-Encoder kann man dann unter Windows mit einem AviSynth-Skript füttern, das die Filterung übernimmt, oder auf verschiedenen Betriebssystemen mit Python alternativ VapourSynth; Hybrid unterstützt jeweils beides, wenn gewünscht.


    Zum "Tiefenscan" kann man die Parameter -probesize (in Bytes) oder -analyzeduration (in Mikrosekunden) verwenden. Standardwert ist jeweils 5 Millionen (also 5 MBytes oder 5 Sekunden), wohl je nach dem was früher erreicht wird. Große Zahlen darf man mit SI-Suffixen angeben (M/G/T *1000, Mi/Gi/Ti *1024).

  • Was die Auswahl an CLI-Software zur Konvertierung angeht, da würde ich eher auf Selur verweisen, der hat mehr praktische Erfahrung damit, welche plattformübergreifende Software verfügbar ist. Im Bereich "DVD rippen" fällt mir lediglich vStrip ein, davon müsste es auch mal eine CLI gegeben haben (als GUI würde ich sonst PGCDemux bevorzugen); aber das ist auch noch der eine nicht voll automatisierbare Schritt, denn DVD-Authoring ist so vielfältig, die Auswahl an PGC, Angle und Spuren muss manuell erfolgen. Optimal ist für meinen Geschmack, wenn man eine fortlaufende "PGC-VOB" mit Videospur und gewünschten Untertitelspuren hat (die kann VobSub / VSRip verarbeiten), und die Tonspuren dazu separat demultiplext wurden, um sie evtl. im Originalformat wieder in die Kopie zu übernehmen.


    Die CLI-Encoder kann man dann unter Windows mit einem AviSynth-Skript füttern, das die Filterung übernimmt, oder auf verschiedenen Betriebssystemen mit Python alternativ VapourSynth; Hybrid unterstützt jeweils beides, wenn gewünscht.


    Zum "Tiefenscan" kann man die Parameter -probesize (in Bytes) oder -analyzeduration (in Mikrosekunden) verwenden. Standardwert ist jeweils 5 Millionen (also 5 MBytes oder 5 Sekunden), wohl je nach dem was früher erreicht wird. Große Zahlen darf man mit SI-Suffixen angeben (M/G/T *1000, Mi/Gi/Ti *1024).

    Danke!


    Die Option "-probesize" funktioniert nicht alleine, sie braucht mindestens noch "-fpsprobesize".


    Code
    1. -probesize <int64> .D....... set probing size (from 32 to I64_MAX) (default 5e+06)
    2. -formatprobesize <int> .D....... number of bytes to probe file format (from 0 to 2.14748e+09) (default 1.04858e+06)
    3. -fpsprobesize <int> .D....... number of frames used to probe fps (from -1 to 2.14748e+09) (default -1)

    Obwohl in der Hilfe steht, dass die Maximalwerte für -formatprobesize und -fpsprobesize im Bereich bis 2GiB liegen dürfen, funktionierten sie bei mir nur bis maximal 255MiB.


    ...dann sehe ich zumindest die ersten 4 Untertitel (die letzten beiden beginnen leider erst nach mehr als 255MiB).


    Gruß

    Yoda

  • Du hast die Dokumentation nicht gründlich gelesen.


    Das "B" multipliziert den Wert mit 8 (weil diese Schreibweise auch für Größenordnungen gilt, die auf der Basis von Bits angegeben werden). Für eine Maximalgröße von 2 GiB könnte man also "2Gi" schreiben, ohne B hier. Ärgerlich natürlich, dass für die Bestimmung des Formats und die Bestimmung der Framerate nur ein 32-bit-Wert erlaubt ist, im Gegensatz zum allgemeinen Scan, der einen 64-bit-Wert erlaubt. Wo da wohl exakt die Unterschiede liegen?


    Weitere Details in dem Sinne müsste man wohl mal dort besprechen, wo die Entwickler von ffmpeg sind, beispielsweise im IRC-Kanal #ffmpeg im Freenode-Netzwerk, vielleicht auch im englischen doom9-Forum (in deutscher Sprache hier bei uns ist die Auswahl an Fachleuten deutlich geringer).


    Was du außerdem noch übersiehst: Auf einer DVD Video befindet sich die vollständige Information darüber, welche Spuren belegt sind, in den IFO-Dateien. Software, die sich nicht um die IFO-Dateien kümmert, sollte zum Konvertieren von DVDs nicht verwendet werden. Leider ist es alles andere als einfach, geeignete Software für jeden Einsatzzweck zu finden.

  • Das ist aber irreführend, denn der Name lautet ja "fpsprobesize" somit bin ich von einer "Größe" ausgegangen...


    Aber egal, denn die vollständige Liste aller Spuren gibt er aus, wenn die beiden Optionen "-probesize" und "-analyzeduration" zusammen verwendet werden:


    Danke!


    Somit sollte das Problem gelöst sein.

    Der Kommando-Start hat auch ohne Fehler funktioniert. :-)

    In ein paar Stunden sollte ich Gewissheit haben...


    Gruß

    Yoda

  • Also, ein kleiner Zwischentest (von 3600. Sekunde bis zur 3660. Sekunde) wurde erfolgreich, mit allen Untertitelspuren erstellt. :-)

    Ich verwende jetzt für die beiden neuen Parameter immer den größtmöglichen Wert (ganz stumpf), das funktioniert prima:


    Und der neu übersetzte Test von mir sieht dann so aus:


    Also scheint mir das Problem jetzt absolut gelöst.


    Danke! Für die sehr hilfreiche Unterstützung! :-)


    Gruß

    Yoda