
Tenho cerca de 100 vídeos (episódios de uma série) duas vezes.
- [avi] Resolução de vídeo 720p com minhas faixas de áudio preferidas
- [mp4] 1080p mas o idioma errado
Obviamente, eu gostaria de terbom vídeo com meu idioma preferido. Mas se for possível gostaria de manter as duas opções de áudio.
Tentei juntá-los manualmente com um joiner mp4 (GUI para mp4box), mas isso leva muito tempo. Eu adoraria ver algumas sugestões para automatizar e otimizar esse processo.
Responder1
Você pode fazer isso facilmente comffmpeg(baixe uma compilação estática) assim:
ffmpeg -i input.mp4 -i input.avi -c copy -map 0:v:0 -map 1:a output.mp4
Isso vaimapaos 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 quiser apenas a primeira use ,1:a:0
etc.
Os fluxos de vídeo e áudio são copiados, portanto esse processo é rápido.
Áudio incompatível
Caso o arquivo AVI use MP3 para fluxos de áudio, eles não poderão 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 recodificaria os fluxos de áudio usando AAC a 192 kBit/s, o que deve ser de qualidade alta o suficiente para que você não perceba nenhum artefato de recodificação.
Ou você pode usar MKV como contêiner de saída, que suporta praticamente 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, obviamente, para executá-lo em todos os arquivos, por exemplo, no Linux com Bash, assumindo que os arquivos MP4 e AVI tenham o mesmo nome base e que você execute-o apenas uma vez (caso contrário, tentará para converter seus arquivos de saída também):
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 online sobre como executar um comando em um loop de arquivo em lote do Windows.