Warum fügt FFmpeg meinen Dateien einen zweiten Untertitel hinzu, obwohl ich explizit nur einen hinzugefügt habe?

400
Peter W.

Ich habe eine Reihe von MP4-Dateien und Untertiteldateien in einem Ordner, die jeweils dem Muster von episode[num].mp4und folgen episode[num].ass.

Ich habe ein kleines Shell-Skript geschrieben, um die Kombination dieser Dateien in MKV-Dateien zu automatisieren:

for i in *.mp4; do  name=`echo $i | cut -d'.' -f1`; mp4name="$name.mp4"; subname="$name.ass"; mkvname="$name.mkv"; ffmpeg -i "$mp4name" -i "$subname" -map 0:v -map 0:a -map 1:s -metadata:s:a language=jpn -metadata:s:s:0 language=eng -c copy -y "$mkvname" done  echo "Done"; 

Beim Öffnen einer der resultierenden MKV-Dateien zeigt VLC zwei Untertitelspuren:

VLC-Untertitelmenü mit zwei Untertitelspuren, eine mit "Track 1 - English" und eine mit "Track 2".

Wer ist hier schuld? FFmpeg, VLC oder mein schnelles und schmutziges Skript? Und wie löse ich dieses Problem?

0

2 Antworten auf die Frage

1
fejyesynb

Sie sind schuld.

Entfernen Sie die vorhandene .assDatei aus dem Verzeichnis des Videos.

VLC zeigt sowohl den eingebetteten Untertitel als auch den Untertitel im Videoverzeichnis.

1
JakeGould

VLC und du bist schuld, aber es hängt von deinem Endziel ab.

FFmpeg fügt keine Untertitel zweimal hinzu, aber VLC erkennt die .assDatei im Verzeichnis automatisch und fügt sie der Liste der verfügbaren Untertitel hinzu. VLC sucht nach Assets (z. B. Untertiteldateien), die den gleichen Namen wie die Videodatei haben, und lädt diese zur Wiedergabe in das Player-Fenster.

Wenn Sie GreatMovie.mkvalso eine GreatMovie.assDatei im Verzeichnis haben und sie abspielen, zeigt VLC die in der MKV-Datei eingebetteten Untertitel sowie die Untertitel an, GreatMovie.assdie sich neben der MKV-Datei in diesem Verzeichnis befinden.

Jetzt sage ich, es hängt von Ihrem Endziel ab. Wenn Ihr Endziel einfach eine kombinierte MKV-Datei ist, die alle Assets enthält, müssen Sie diese .assDatei löschen, nachdem sie fertig ist. Daher würde ich Ihr Skript ändern, indem Sie rm -f "$subname";nach dem ffmpegBefehl ein Rechtszeichen hinzufügen, um dies zu tun:

for i in *.mp4; do  name=`echo $i | cut -d'.' -f1`; mp4name="$name.mp4"; subname="$name.ass"; mkvname="$name.mkv"; ffmpeg -i "$mp4name" -i "$subname" -map 0:v -map 0:a -map 1:s -metadata:s:a language=jpn -metadata:s:s:0 language=eng -c copy -y "$mkvname" rm -f "$subname"; done  echo "Done"; 

Oder erstellen Sie ein completed_subs/Verzeichnis und verschieben Sie die Untertitel, wenn Sie fertig sind.

for i in *.mp4; do  name=`echo $i | cut -d'.' -f1`; mp4name="$name.mp4"; subname="$name.ass"; mkvname="$name.mkv"; ffmpeg -i "$mp4name" -i "$subname" -map 0:v -map 0:a -map 1:s -metadata:s:a language=jpn -metadata:s:s:0 language=eng -c copy -y "$mkvname" mkdir -p "completed_sub"; mv $subname "completed_sub/$subname"; done  echo "Done"; 

Auf diese Weise entfernen Sie die Untertitel aus dem Verarbeitungsverzeichnis, sodass beim Anzeigen der MKV-Datei nur Untertitel angezeigt werden, die in der MKV-Datei eingebettet sind, und sich nun die eigenständigen Untertiteldateien .assbefinden completed_sub/. So können Sie nicht nur sehen, was abgeschlossen wurde, sondern auch die eigenständigen Untertiteldateien behalten, wenn Sie sie in der Zukunft benötigen.

Es macht Sinn, keine Ahnung, warum ich nicht daran gedacht habe. Vielen Dank! Peter W. vor 5 Jahren 1