Une de manera eficiente pistas de audio de avi a mp4

Une de manera eficiente pistas de audio de avi a mp4

Tengo alrededor de 100 vídeos (episodios de una serie) dos veces.

  1. [avi] Resolución de vídeo de 720p con mis pistas de audio preferidas
  2. [mp4] 1080p pero el idioma equivocado

Obviamente me gustaría tenerbuen video con mi idioma preferido. Pero si es posible me gustaría mantener ambas opciones de audio.

Intenté unirlos manualmente con un ensamblador mp4 (GUI para mp4box), pero eso lleva mucho tiempo. Me encantaría ver algunas sugerencias para automatizar y optimizar ese proceso.

Respuesta1

Puedes hacer esto muy fácilmente conffmpeg(descargue una compilación estática) así:

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

Esta voluntadmapalas siguientes secuencias al archivo de salida:

  • el primer canal de vídeo de la primera entrada ( 0:v:0)
  • los canales de audio de la segunda entrada ( 1:a) – si solo quieres el primero, usa 1:a:0, etc.

Las transmisiones de vídeo y audio se copian, por lo que este proceso es rápido.

Audio incompatible

En caso de que el archivo AVI utilice MP3 para transmisiones de audio, no se pueden asignar a un archivo MP4. En este caso, utilice:

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

Esto volvería a codificar las transmisiones de audio usando AAC a 192 kBit/s, lo que debería tener una calidad lo suficientemente alta como para que no notes ningún artefacto durante la recodificación.

O puede utilizar MKV como contenedor de salida, que admite prácticamente cualquier códec:

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

Cómo ejecutar por lotes

Puede usar este comando en un bucle, obviamente, para ejecutarlo en todos los archivos, por ejemplo, en Linux con Bash, asumiendo que los archivos MP4 y AVI tienen el mismo nombre base y que solo lo ejecuta una vez (de lo contrario, intentará para convertir también sus archivos de salida):

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

Encontrará muchos ejemplos en línea sobre cómo ejecutar un comando en un bucle de archivo por lotes de Windows.

información relacionada