ffmpeg: Videos mit "non monotonically increasing timestamps" konvertieren

Wenn ich mit ffmpeg Videos in das x264-Format (in einem mkv-Container) umkodieren will, stoße ich manchmal auf folgende Fehlermeldung:

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

Danach bricht ffmpeg ab. "dts" hat dabei übrigens nicht mit dem Tonformat "DTS" zu tun, dennoch liegt das Problem an der Tonspur, die offenbar nicht ganz standardkonform ist, auch wenn ein Videoplayer sie abspielen kann. Es gibt diverse Patches, die dieses Problem umgehen sollen, aber nach meiner Erfahrung funktionieren sich nicht in allen Fällen oder haben andere Nebenwirkungen (z.B. kurze Aussetzer).

Erfolgsversprechender ist es, Video- und Tonspur einzelnd zu kodieren (bzw. letztere entnehme ich meistens unverändert aus der Quelle) und diese danach zusammenzufügen. Theoretisch kann es dabei zwar zu Sync-Problemen kommen, aber wenn beides aus der gleichen Quelldatei stammt sollte es funktionieren.

Zuerst konvertiert man die Videospur:

$ ffmpeg -i quelle.vob \
# Verwende alle Kerne. Ggf. die Zahl der zu verwendenen CPU-Kerne angeben
    -threads 0 \
# Kein Audio und keine Untertitel (Subtitle)
    -an -sn \
# eigene Präferenzen für Videokodierung
    -vcodec libx264 -preset slow -tune film -level 41 -crf 23 \
Zieldatei im mkv-Format
    ziel-nosound.mkv

Anschließend fügt man die Tonspuren hinzu. In diesem Beispiel wollen wir die erste (englisch) und die dritte (deutsch) Tonspur aus der Quelle nehmen, wobei die deutsche jedoch vom Player standardmäßig ausgewählt werden soll:

$ mkvmerge \
# Ziel mit Tonspuren
    -o ziel.mkv \ 
# Optionaler Filmtitel
    --title "Titel des Films" \ 
# Nur Videospur (-A) aus temp. Ziel nehmen
    -A ziel-nosound.mkv \ 
# Keine Videospur (-D) und die Audiospuren 1 und 3 der Quelle...
    -D -a 1,3 \
# ...Sprachen und Standardspur in der Quelle...
    --language 1:eng --language 3:ger --default-track 3 \
# Video und Tonspur entstammen der selben Quelle, sonst file
    --append-mode track  \
    quelle.vob

Vorsicht, die Angabe der Sprache und der Standardspur bezieht sich auf die Nummer in der Quelldatei. Dementsprecend beziehen sich solche Parameter immer auf die nächste angegebene Quelldatei.

Danach sollte man die korrekte Zuordnung und die Synchronisierung der Tonspuren prüfen.

Comments

Also ich habe mein Problem (teilweise) so können lösen: Mit avidemux (im Terminal gestartet) zeigt es an, dass er das Problem erkennt und halt nicht wie avconv abbricht:

lavformat mpeg muxer initialized
LavMuxer:Audio DTS is too low 0 / 40000!
LavMuxer:Audio DTS is too low 0 / 40000!
LavMuxer:Audio DTS is too low 21333 / 40000!

Somit geht es auch so. (nicht bei allen Videos, aber manchen!)