FFMPEG mux video y audio (de otro video) - problema de mapeo

81

Me gustaría colocar el audio de un video a otro video sin audio (en un comando):

ffmpeg.exe -i video1_noAudio.mov -i video2_wAudio.mov -vcodec copy -acodec copy video1_audioFromVideo2.mov

Supongo que "-map" es la forma correcta de hacerlo, pero me confundí con él.

¿Puede sugerir cómo resolverlo?

marca
fuente

Respuestas:

220

Resumen de entradas

input_0.mp4tiene el flujo de video deseado y input_1.mp4tiene el flujo de audio deseado:

diagrama de mapeo

En ffmpeglas corrientes se ve así:

$ ffmpeg -i input_0.mp4 -i input_1.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input_0.mp4':
  Duration: 00:01:48.50, start: 0.000000, bitrate: 4144 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 4014 kb/s, SAR 115:87 DAR 1840:783, 23.98 fps, 23.98 tbr, 16k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 124 kb/s (default)

Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'input_1.mp4':
  Duration: 00:00:30.05, start: 0.000000, bitrate: 1754 kb/s
    Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 720x480 [SAR 8:9 DAR 4:3], 1687 kb/s, 59.94 fps, 59.94 tbr, 60k tbn, 119.88 tbc (default)
    Stream #1:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 55 kb/s (default)

Números de identificación

ffmpegse refiere a archivos de entrada y flujos con números de índice. El formato es input_file_id:input_stream_id. Dado que ffmpegcomienza a contar desde 0, la transmisión se 1:1refiere al audio de input_1.mp4.

Especificadores de flujo

Esto se puede mejorar con especificadores de flujo . Por ejemplo, puede decir ffmpegque desea el primer flujo de video de la primera entrada ( 0:v:0) y el primer flujo de audio de la segunda entrada ( 1:a:0). Prefiero este método porque es más eficiente. Además, es menos propenso a mapeo accidental porque 1:1puede referirse a cualquier tipo de flujo, mientras que 2:v:3solo se refiere al cuarto flujo de video del tercer archivo de entrada.

Ejemplos

La -mapopción indica ffmpegqué transmisiones desea. Para copiar el video input_0.mp4y el audio de input_1.mp4:

$ ffmpeg -i input_0.mp4 -i input_1.mp4 -c copy -map 0:0 -map 1:1 -shortest out.mp4

Este siguiente ejemplo hará lo mismo:

$ ffmpeg -i input_0.mp4 -i input_1.mp4 -c copy -map 0:v:0 -map 1:a:0 -shortest out.mp4
  • -map 0:v:0se puede traducir como: desde la primera entrada ( 0), seleccione el tipo de flujo de video ( v), primer flujo de video ( 0)

  • -map 1:a:0se puede traducir como: desde la segunda entrada ( 1), seleccione el tipo de flujo de audio ( a), primer flujo de audio ( 0)

Notas adicionales

  • Con -c copylas transmisiones, la transmisión se copiará , no se volverá a codificar, por lo que no habrá pérdida de calidad. Si desea volver a codificar, consulte FFmpeg Wiki: Guía de codificación H.264 .

  • La -shortestopción hará que la duración de la salida coincida con la duración del flujo de entrada más corto.

  • Consulte la -mapdocumentación de la opción para obtener más información.

llogan
fuente
17
Voto a favor, porque esta es la mejor descripción + ejemplo que encontré tratando de hacer esto mismo durante horas.
Mark Ping
4
¡Gracias no solo por resolverlo sino también por explicarlo!
Mathias
1
Esta explicación es perfecta para principiantes de
mapas
2
@FernandoEspinosa La edición es realmente incorrecta. -map 1:0haría referencia al video de input_1.mp4, no al audio. El ejemplo debería obtener el audio, por lo que tiene que serlo -map 1:1o -map 1:a:0que en este caso da como resultado la transmisión de audio deseada. Consulte la imagen en la respuesta para obtener una representación visual.
Llogan
1

Tengo un nuevo comando para fusionar audio con video

ffmpeg -i video.mp4 -i audio.mp4 -map 0.0 -map 1.0 -acodec copy -qscale 4 -vcodec mpeg4 outvideo.mp4

-qscale es la opción de establecer la calidad del video de ffmpeg

-acodec copy es la opción de copiar la calidad predeterminada de audio a la salida de video

-vcodec mpeg4 es la opción de copiar la calidad predeterminada de video a la salida de video

HoangHieu
fuente
1
-vcodecha existido desde siempre. Es lo mismo que los alias más nuevos -codec:vy -c:v.
llogan
@HoangHieu ¿puedo agregar audio wav a un video mp4? Intenté ffmpeg -i 1.mp4 -i 0.wav -map 0 -map 1 -codec copy -shortest new.mp4el comando pero no funcionó
Allan
?? tu mando. 0.0 no 0 , 1.0 no 1 - 1.0 significa: índice [1] canal [0] ... - copia acodec no copia codec , significa copia códec de audio
HoangHieu
Es posible que desee -vcodec copypara evitar la re-codificar el vídeo
wolfd
0

Como respuesta complementaria específica de MKV:

MKVToolnix puede hacer eso. Prefiero la GUI.

Una vez que se haya agregado el primer video, agregue el segundo ("Agregar archivos de origen"), luego mantenga seleccionadas solo las transmisiones deseadas y presione "Iniciar multiplexación".

ingrese la descripción de la imagen aquí

cipricus
fuente