Come aggiungere un nuovo audio (non mixato) in un video usando ffmpeg?

Ho usato un comando come:

ffmpeg -i video.avi -i audio.mp3 -vcodec codec -acodec codec output_video.avi -newaudio 

nell’ultima versione per aggiungere una nuova traccia audio al video (non mixare).

Ma ho aggiornato ffmpeg alla versione più recente (versione ffmpeg git-2012-06-16-809d71d ) e ora in questa versione il parametro -newaudio non funziona.

Dimmi, per favore, come posso aggiungere nuovo audio al mio video (non mixare) usando ffmpeg .

Aggiungi audio al video: copia in streaming

 ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi 
  • Se si -map opzione -map verrà utilizzata la selezione di stream predefinita. Funzionerà se l’input video non ha audio.
  • Questo esempio usa -codec copy per eseguire lo streaming della copia (nessuna ricodifica, la qualità è preservata ed è veloce).
  • L’opzione -shortest renderà output.avi la stessa durata dell’input più breve.

Aggiungi audio al video: ricodifica

Se al tuo output non piacciono i formati originali, o se vuoi cambiare formato puoi specificare gli encoder:

 ffmpeg -i video.avi -i audio.mp3 -c:v libx264 -c:a libvorbis -shortest output.mkv 

Per selezionare manualmente flussi specifici

A volte la selezione del stream predefinito non ti darà il risultato che desideri. In questo esempio video.mp4 ha video e audio e audio.m4a ha solo audio. Usa -map per scegliere il video da video.mp4 e audio da audio.m4a :

 ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4 
  • -map 0:v – Dall’ingresso 0 (il primo input, che è video.mp4 ) sceglie il v stream / i video.
  • -map 1:a – Dall’ingresso 1 (il secondo input, che è audio.m4a ), seleziona il / i stream / i audio.m4a .

Mescolando / combinando due ingressi audio in uno

Scatta video da video.webm e utilizza il filtro Amerge per unire l’audio di video.webm e audio.oga :

 ffmpeg -i video.webm -i audio.oga -filter_complex \ "[0:a][1:a]amerge=inputs=2[a]" \ -map 0:v -map "[a]" -c:v copy -c:a libvorbis -ac 2 -shortest out.webm 

Genera audio silenzioso

Puoi usare il filtro anullsrc per creare un stream audio silenzioso. Il filtro consente di scegliere il layout del canale desiderato (mono, stereo, 5.1, ecc.) E la frequenza di campionamento.

 ffmpeg -i video.mp4 -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 \ -c:v copy -shortest output.mp4 

Vedi anche

  • Combina due flussi audio in uno
  • FFmpeg Wiki: Manipulation del canale audio
  • FFmpeg mux video e audio da un altro video

musica mp3 in wav

 ffmpeg -i music.mp3 music.wav 

troncare per adattarsi al video

 ffmpeg -i music.wav -ss 0 -t 37 musicshort.wav 

mixare musica e video

 ffmpeg -i musicshort.wav -i movie.avi final_video.avi 

Se il video di input ha più tracce audio ed è necessario aggiungerne un altro, utilizzare il seguente comando:

 ffmpeg -i input_video_with_audio.avi -i new_audio.ac3 -map 0 -map 1 -codec copy output_video.avi 

-map 0 significa copiare (includere) tutti gli stream dal primo file di input ( input_video_with_audio.avi ) e -map 1 significa includere tutti gli stream (in questo caso uno) dal secondo file di input ( new_audio.ac3 ).

Nessuna di queste soluzioni ha funzionato abbastanza per me. Il mio audio originale veniva sovrascritto oppure ricevevo un errore come “imansible mappare la memoria” con l’esempio più complesso “amerge”. Sembra che mi serva -filter_complex amix.

 ffmpeg -i videowithaudioyouwanttokeep.mp4 -i audiotooverlay.mp3 -vcodec copy -filter_complex amix -map 0:v -map 0:a -map 1:a -shortest -b:a 144k out.mkv 

Se stai utilizzando una vecchia versione di FFMPEG e non puoi eseguire l’aggiornamento, puoi fare quanto segue:

 ffmpeg -i PATH/VIDEO_FILE_NAME.mp4 -i PATH/AUDIO_FILE_NAME.mp3 -vcodec copy -shortest DESTINATION_PATH/NEW_VIDEO_FILE_NAME.mp4 

Si noti che ho usato -vcodec

Codice per aggiungere audio al video usando ffmpeg.

Se la lunghezza dell’audio è maggiore della lunghezza del video, la lunghezza dell’audio verrà ridotta a quella del video. Se vuoi che l’audio completo del video rimuova -shortest dal cmd.

String[] cmd = new String[]{"-i", selectedVideoPath,"-i",audiopath,"-map","1:a","-map","0:v","-codec","copy", ,outputFile.getPath()};

 private void execFFmpegBinaryShortest(final String[] command) { final File outputFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4"); String[] cmd = new String[]{"-i", selectedVideoPath,"-i",audiopath,"-map","1:a","-map","0:v","-codec","copy","-shortest",outputFile.getPath()}; try { ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() { @Override public void onFailure(String s) { System.out.println("on failure----"+s); } @Override public void onSuccess(String s) { System.out.println("on success-----"+s); } @Override public void onProgress(String s) { //Log.d(TAG, "Started command : ffmpeg "+command); System.out.println("Started---"+s); } @Override public void onStart() { //Log.d(TAG, "Started command : ffmpeg " + command); System.out.println("Start----"); } @Override public void onFinish() { System.out.println("Finish-----"); } }); } catch (FFmpegCommandAlreadyRunningException e) { // do nothing for now System.out.println("exceptio :::"+e.getMessage()); } }