FFMPEG mux video e audio (da un altro video) – problema di mapping

Vorrei posizionare l’audio da un video a un altro video senza audio (in un unico comando):

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

Immagino che “-map” sia il modo corretto per farlo ma mi sono confuso con esso.

Puoi suggerire come risolverlo?

Panoramica degli input

input_0.mp4 ha il stream video desiderato e input_1.mp4 ha il stream audio desiderato:

diagramma di mappatura

In ffmpeg i flussi assomigliano a questo:

 $ 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) 

Numeri di identificazione

ffmpeg riferisce a file di input e flussi con numeri di indice. Il formato è input_file_id:input_stream_id . Poiché ffmpeg inizia a contare da 0, il stream 1:1 fa riferimento all’audio da input_1.mp4 .

Specificatori di stream

Questo può essere migliorato con gli specificatori di stream . Ad esempio, puoi dire a ffmpeg che vuoi il primo stream video dal primo input ( 0:v:0 ) e il primo stream audio dal secondo input ( 1:a:0 ). Preferisco questo metodo perché è più efficiente. Inoltre, è meno incline alla mapping accidentale perché 1:1 può riferirsi a qualsiasi tipo di stream, mentre 2:v:3 si riferisce solo al quarto stream video del terzo file di input.

Esempi

L’opzione -map indica a ffmpeg quali flussi vuoi. Per copiare il video da input_0.mp4 e audio da input_1.mp4 :

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

Questo prossimo esempio farà la stessa cosa:

 $ 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:0 può essere tradotto come: dal primo input ( 0 ), selezionare il tipo di stream video ( v ), primo stream video ( 0 )

  • -map 1:a:0 può essere tradotto come: dal secondo input ( 1 ), selezionare il tipo di stream audio ( a ), primo stream audio ( 0 )

Note aggiuntive

  • Con -c copy gli stream saranno copiati in streaming , non ricodificati, quindi non ci sarà perdita di qualità. Se vuoi ricodificare, consulta FFmpeg Wiki: H.264 Encoding Guide .

  • L’opzione -shortest farà sì che la durata dell’output corrisponda alla durata del stream di input più breve.

  • Vedi la documentazione dell’opzione -map per maggiori informazioni.

Ho un nuovo comando per unire l’audio al video

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

-qscale è l’opzione set quality al video di ffmpeg

-acodec copy is option copia la qualità predefinita dell’audio per l’output video

-vcodec mpeg4 è un’opzione copia la qualità predefinita del video per l’output video