Por que o FFmpeg adiciona uma segunda legenda aos meus arquivos, mesmo que eu tenha adicionado apenas um?

0

Eu tenho um monte de arquivos MP4 e arquivos de legenda em uma pasta, cada um seguindo o padrão de episode[num].mp4 e episode[num].ass .

Eu escrevi um pequeno script de shell para automatizar a combinação deles em arquivos 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";

Ao abrir um dos arquivos MKV resultantes, o VLC mostra duas faixas de legenda:

VLCmenudelegendasmostrandoduasfaixasdelegendas,umarotulada"Faixa 1 - em inglês" e uma chamada "Faixa 2"

Quem é o culpado aqui? FFmpeg, VLC, ou meu script rápido e sujo? E como resolvo esse problema?

    
por Peter W. 23.06.2018 / 18:56

2 respostas

1

VLC e você são os culpados, mas isso depende do seu objetivo final.

O FFmpeg não está adicionando legendas duas vezes, mas o VLC está detectando automaticamente o arquivo .ass no diretório e adicionando-o à lista de legendas disponíveis. O VLC procura recursos - como arquivos de legenda - que tenham exatamente o mesmo nome do arquivo de vídeo e os carreguem na janela do player para fins de reprodução.

Então, se você estiver jogando GreatMovie.mkv , você tem um arquivo GreatMovie.ass no diretório e o reproduz, o VLC exibirá as legendas incorporadas no arquivo MKV , bem como que GreatMovie.ass está sentado ao lado do arquivo MKV nesse diretório.

Agora eu digo que depende do seu objetivo final. Se seu objetivo final for simplesmente um arquivo MKV combinado que contenha todos os recursos, será necessário excluir esse arquivo .ass depois que ele for concluído. Então, eu modificaria seu script adicionando um rm -f "$subname"; logo após o comando ffmpeg , como tal para fazer isso:

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

Ou talvez crie um diretório completed_subs/ e mova as legendas para esse diretório quando terminar.

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

Dessa forma, você remove as legendas do diretório de processamento para que a exibição do arquivo MKV mostre apenas os recursos de legenda incorporados no arquivo MKV e os arquivos .ass da legenda autônoma estejam em completed_sub/ . Assim, você pode não apenas ver o que foi concluído, mas também reter os arquivos de legenda autônomos, se de alguma forma precisar deles no futuro.

    
por 23.06.2018 / 19:31
1

Você é o culpado.

Remova o arquivo .ass existente do diretório do vídeo.

O VLC está mostrando tanto a legenda embutida quanto a que está no diretório do vídeo.

    
por 23.06.2018 / 19:20