Perché FFmpeg aggiunge un secondo sottotitolo ai miei file, anche se ne ho aggiunto esplicitamente solo uno?


0

Ho un sacco di file MP4 e file di sottotitoli in una cartella, ognuno seguendo il modello di episode[num].mp4e episode[num].ass.

Ho scritto un piccolo script di shell per automatizzare la combinazione di questi in file MKV:

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";

All'apertura di uno dei file MKV risultanti, VLC mostra due tracce di sottotitoli:

Menu sottotitoli VLC che mostra due tracce sottotitoli, una etichettata "Traccia 1 - Inglese" e una appena etichettata "Traccia 2"

Di chi è la colpa qui? FFmpeg, VLC o il mio script veloce e sporco? E come posso risolvere questo problema?

Risposte:


1

VLC e tu sei la colpa, ma dipende dal tuo obiettivo finale.

FFmpeg non aggiunge due sottotitoli, ma VLC rileva automaticamente il .assfile nella directory e lo aggiunge all'elenco dei sottotitoli disponibili. VLC cerca risorse — come i file dei sottotitoli — che hanno lo stesso nome del file video e li caricano nella finestra del lettore a scopo di riproduzione.

Quindi, se stai giocando GreatMovie.mkvhai un GreatMovie.assfile nella directory e lo riproduci, VLC mostrerà i sottotitoli incorporati nel file MKV e quello GreatMovie.assche si trova accanto al file MKV in quella directory.

Ora dico che dipende dal tuo obiettivo finale. Se il tuo obiettivo finale è semplicemente un file MKV combinato che contenga tutti gli asset, devi eliminarlo .assdopo averlo fatto. Quindi vorrei modificare il tuo script, aggiungendo rm -f "$subname";subito dopo il ffmpegcomando, come tale per farlo:

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";

O forse creare una completed_subs/directory e spostare i sottotitoli in quella directory al termine.

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";

In questo modo rimuovi i sottotitoli dalla directory di elaborazione, quindi la visualizzazione del file MKV mostrerà solo le risorse dei sottotitoli incorporate nel file MKV e i .assfile dei sottotitoli standalone sono ora presenti completed_sub/. Quindi non solo puoi vedere cosa è stato completato, ma anche conservare i file dei sottotitoli autonomi se in qualche modo ne hai bisogno in futuro.


1
Ha senso, non ho idea del perché non ci abbia pensato. Grazie!
Peter W.

1

Sei la colpa.

Rimuovi il .assfile esistente dalla directory del video.

VLC mostra sia il sottotitolo incorporato sia quello nella directory del video.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.