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


132

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 ( ffmpeg versione git-2012-06-16-809d71d ) e ora in questa versione il parametro -newaudionon funziona.

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


@Kiquenet Sì, hai ragione. E la risposta è già stata data. Basta leggere questa discussione. Questa domanda ha 5 anni.
Vetalll,

Aggiungendo nuovo audio intendi sostituire l'audio, giusto? Potrei modificare la tua domanda per chiarirlo.
tommy.carstensen,

Risposte:


295

Aggiungi audio al video: copia in streaming

ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
  • Se si omette l' -mapopzione, verrà utilizzata la selezione del flusso predefinita . Funzionerà se l'ingresso video non ha audio.
  • Questo esempio usa -codec copyper eseguire lo streaming della copia (nessuna ricodifica; la qualità viene preservata ed è veloce).
  • L' -shortestopzione avrà output.avila 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 dello stream predefinita non ti darà il risultato desiderato. In questo esempio video.mp4ha video e audio e audio.m4aha solo audio. Utilizzare -mapper scegliere video da video.mp4e 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'input 0(il primo input, ovvero video.mp4) scegli il vflusso video.
  • -map 1:a- Dall'ingresso 1(il secondo ingresso, che è audio.m4a) scegliere il aflusso audio (s).

Mixaggio / combinazione di due ingressi audio in uno

Prendi video da video.webme usa il filtro amerge per combinare l'audio da video.webme 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

È possibile utilizzare il filtro anullsrc per creare un flusso 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


5
All'inizio non ha funzionato per me, ma usare -map 0:0 -map 1:0invece di -map 0 -map 1fare il trucco per me. Grazie!
yonix,

Ciò inserisce una cornice vuota all'inizio.
Lenar Hoyt,

ho provato questo comando, ma perdo l'audio del video. il mio formato video è mp4
Allan,

@ Allan.Chan La domanda originale non voleva l'audio dall'ingresso video, ma ho aggiunto un altro esempio: vedi il mixaggio / combinazione di un altro esempio di ingresso audio .
Llogan,

La prima soluzione senza l' -shortestopzione ha funzionato meglio per me.
mmj,

24

musica mp3 da wav

ffmpeg -i music.mp3 music.wav

troncare per adattarsi al video

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

mescola musica e video

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

3
come ricordo, l'ultima variante sostituirà il vecchio audio con il nuovo.
Vetalll,

C'è qualche opzione per unire il nuovo audio con il vecchio audio?
Iqbal Malik,

1
@jwilson Ho provato questo comando, ma perdo l'audio del video. il mio formato video è mp4
Allan,

@ Soluzione Allan per non perdere?
Kiquenet,

20

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

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

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


Penso che questa risposta debba essere la migliore risposta.
Nabi KAZ,

3

Nessuna di queste soluzioni ha funzionato abbastanza per me. Il mio audio originale veniva sovrascritto, oppure stavo ricevendo un errore come "impossibile mappare la memoria" con l'esempio "amerge" più complesso. Sembra che avessi bisogno di -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

1

Niente ha funzionato abbastanza per me (penso che sia stato perché il mio video .mp4 di input non aveva alcun audio) quindi ho trovato che funzionava per me:

ffmpeg -i input_video.mp4 -i balipraiavid.wav -map 0:v:0 -map 1:a:0 output.mp4


0

Se si utilizza una versione precedente di FFMPEG e non è possibile eseguire l'aggiornamento, è possibile effettuare le seguenti operazioni:

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


0

Codice per aggiungere audio al video usando ffmpeg.

Se la lunghezza dell'audio è maggiore della lunghezza del video, ridurrà l'audio alla lunghezza del video. Se si desidera un audio completo nel video, rimuovere -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());
            }


        }

Che cosa è Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");?
Kiquenet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.