Junte-se a faixas de áudio de avi a mp4

1

Eu tenho cerca de 100 vídeos (episódios de uma série) duas vezes.

  1. [avi] resolução de vídeo de 720p com minhas faixas de áudio preferidas
  2. [mp4] 1080p, mas a linguagem errada

Obviamente, gostaria de ter um bom vídeo com o meu idioma preferido . Mas se for possível, eu gostaria de manter as duas opções de áudio.

Eu tentei juntá-las manualmente com um mp4 joiner (GUI para mp4box), mas isso leva muito tempo. Eu adoraria ver algumas sugestões para automatizar e otimizar esse processo.

    
por Proxycon 21.08.2018 / 18:24

1 resposta

1

Você pode fazer isso muito facilmente com o ffmpeg (faça o download de uma versão estática) da seguinte forma:

ffmpeg -i input.mp4 -i input.avi -c copy -map 0:v:0 -map 1:a output.mp4

Isso mapeará os seguintes fluxos para o arquivo de saída:

  • o primeiro canal de vídeo da primeira entrada ( 0:v:0 )
  • os canais de áudio da segunda entrada ( 1:a ) - se você quiser apenas o primeiro, use 1:a:0 , etc.

Os fluxos de áudio e vídeo são copiados, portanto, esse processo é rápido.

Áudio incompatível

No caso em que o arquivo AVI usa MP3 para fluxos de áudio, eles não podem ser mapeados para um arquivo MP4. Neste caso, use:

ffmpeg -i input.mp4 -i input.avi -c:v copy -c:a aac -b:a 192k -map 0:v:0 -map 1:a output.mp4

Isso recodificará os streams de áudio usando o AAC em 192 kBit / s, o que deve ter qualidade alta o suficiente para que você não perceba nenhum artefato da re-codificação.

Ou, você pode usar o MKV como um contêiner de saída, que suporta virtualmente qualquer codec:

ffmpeg -i input.mp4 -i input.avi -c copy -map 0:v:0 -map 1:a output.mkv

Como executar em lote

Você pode usar este comando em um loop, obvisouly, para executá-lo em todos os arquivos, por exemplo, no Linux com o Bash, supondo que os arquivos MP4 e AVI tenham o mesmo nome base e que você o execute apenas uma vez (caso contrário, ele também tentará converter seus arquivos de saída):

for f in *.mp4; do
    aviFile="${f%%.mp4}.avi" # replace the extension
    outputFile="${f%%.mp4}-output.mp4" # create output filename
    ffmpeg -i "$f" -i "$aviFile" -c copy -map 0:v:0 -map 1:a "$outputFile"
done

Você encontrará muitos exemplos on-line sobre como executar um comando em um loop de arquivo em lotes do Windows.

    
por 21.08.2018 / 21:46