Comment ajouter un nouvel audio (sans mixage) dans une vidéo en utilisant ffmpeg?

132

J'ai utilisé une commande comme:

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

dans la dernière version pour ajouter une nouvelle piste audio à la vidéo (pas de mixage).

Mais j'ai mis à jour le ffmpeg vers la dernière version (version ffmpeg git-2012-06-16-809d71d ) et maintenant dans cette version, le paramètre -newaudione fonctionne pas.

Dites-moi s'il vous plaît comment je peux ajouter un nouvel audio à ma vidéo (pas de mixage) en utilisant ffmpeg.

Vetalll
la source
@Kiquenet Oui, vous avez raison. Et la réponse est déjà donnée. Lisez simplement ce fil. Cette question a 5 ans.
Vetalll
En ajoutant un nouvel audio, vous entendez remplacer l'audio, non? Je pourrais modifier votre question pour que cela soit clair.
tommy.carstensen

Réponses:

295

Ajouter de l'audio à la vidéo: copie de flux

ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
  • Omettre l' -mapoption utilisera la sélection de flux par défaut . Cela fonctionnera si votre entrée vidéo n'a pas d'audio.
  • Cet exemple utilise -codec copypour diffuser la copie (pas de ré-encodage; la qualité est préservée et c'est rapide).
  • L' -shortestoption aura output.avila même durée que l'entrée la plus courte.

Ajouter de l'audio à la vidéo: ré-encoder

Si votre sortie n'aime pas les formats d'origine, ou si vous souhaitez modifier les formats, vous pouvez spécifier les encodeurs:

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

Pour choisir manuellement des flux spécifiques

Parfois, la sélection de flux par défaut ne vous donnera pas le résultat souhaité. Dans cet exemple, il video.mp4contient de la vidéo et de l' audio, et audio.m4auniquement de l'audio. Utilisez -mappour choisir la vidéo video.mp4et l'audio à partir de audio.m4a:

ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4
  • -map 0:v- À partir de l'entrée 0(la première entrée, qui est video.mp4), choisissez lev flux idéo.
  • -map 1:a- À partir de l'entrée 1(la deuxième entrée, qui est audio.m4a), choisissez lea (s) flux udio.

Mixer / combiner deux entrées audio en une

Prenez une vidéo à partir de video.webmet utilisez le filtre amerge pour combiner l'audio de video.webmet 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

Générer un son silencieux

Vous pouvez utiliser le filtre anullsrc pour créer un flux audio silencieux. Le filtre vous permet de choisir la disposition des canaux souhaitée (mono, stéréo, 5.1, etc.) et la fréquence d'échantillonnage.

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

Regarde aussi

llogan
la source
5
Cela n'a pas fonctionné pour moi au début, mais utiliser à la -map 0:0 -map 1:0place a -map 0 -map 1fait l'affaire pour moi. Merci!
yonix
Cela insère un cadre vide au début.
Lenar Hoyt
J'ai essayé cette commande, mais je perds l'audio vidéo. mon format vidéo est mp4
Allan
@ Allan.Chan La question originale ne voulait pas de l'audio de l'entrée vidéo, mais j'ai ajouté un autre exemple: voir l'exemple Mixage / combinaison d'une autre entrée audio .
llogan
La 1ère solution sans l' -shortestoption fonctionnait mieux pour moi.
mmj
24

musique mp3 en wav

ffmpeg -i music.mp3 music.wav

tronquer pour adapter la vidéo

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

mélanger la musique et la vidéo

ffmpeg -i musicshort.wav -i movie.avi final_video.avi
Jwilson
la source
3
si je me souviens bien, la dernière variante remplacera l'ancien audio par un nouveau.
Vetalll
Existe-t-il une option pour fusionner le nouvel audio avec l'ancien audio?
Iqbal Malik le
1
@jwilson j'ai essayé cette commande, mais je perds l'audio vidéo. mon format vidéo est mp4
Allan
@Allan solution pour ne pas perdre?
Kiquenet
20

Si la vidéo d'entrée a plusieurs pistes audio et que vous devez en ajouter une autre, utilisez la commande suivante:

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

-map 0signifie copier (inclure) tous les flux du premier fichier d'entrée ( input_video_with_audio.avi) et -map 1moyen d'inclure tous les flux (dans ce cas un) du deuxième fichier d'entrée ( new_audio.ac3).

user2513149
la source
Je pense que cette réponse doit être la meilleure.
Nabi KAZ
3

Aucune de ces solutions n'a vraiment fonctionné pour moi. Mon audio d'origine était en cours d'écrasement, ou j'obtenais une erreur du type «échec de la cartographie de la mémoire» avec l'exemple plus complexe «amerge». Il semble que j'avais besoin de -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
Tod
la source
1

Rien n'a vraiment fonctionné pour moi (je pense que c'était parce que ma vidéo d'entrée .mp4 n'avait pas d'audio), alors j'ai trouvé que cela fonctionnait pour moi:

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

Alexandre Doré
la source
0

Si vous utilisez une ancienne version de FFMPEG et que vous ne pouvez pas mettre à niveau, vous pouvez effectuer les opérations suivantes:

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

Notez que j'ai utilisé -vcodec

Waqleh
la source
0

Code pour ajouter de l'audio à la vidéo à l'aide de ffmpeg.

Si la longueur audio est supérieure à la longueur vidéo, la longueur audio en vidéo sera coupée. Si vous voulez un son complet dans la vidéo, supprimez -shortest de la 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());
            }


        }
Bourreau
la source
C'est quoi Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");?
Kiquenet