¿Cómo agregar un nuevo audio (sin mezclar) en un video usando ffmpeg?

131

Usé un comando como:

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

en la última versión para agregar una nueva pista de audio al video (no mezclar).

Pero actualicé el ffmpeg a la versión más reciente (versión ffmpeg git-2012-06-16-809d71d ) y ahora en esta versión el parámetro -newaudiono funciona.

Dime por favor cómo puedo agregar nuevo audio a mi video (no mezclar) usando ffmpeg.

Vetalll
fuente
@ Kiquenet Sí, tienes razón. Y la respuesta ya está dada. Solo lee este hilo. Esta pregunta tiene 5 años.
Vetalll
Al agregar nuevo audio te refieres a reemplazar el audio, ¿verdad? Podría editar tu pregunta para aclarar eso.
tommy.carstensen

Respuestas:

295

Agregar audio al video: copia de transmisión

ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
  • Al omitir la -mapopción, se usará la selección de transmisión predeterminada . Esto funcionará si su entrada de video no tiene audio.
  • Este ejemplo se utiliza -codec copypara transmitir una copia (sin volver a codificar; la calidad se conserva y es rápida).
  • La -shortestopción tendrá output.avila misma duración que la entrada más corta.

Agregue audio al video: vuelva a codificar

Si a su salida no le gustan los formatos originales, o si desea cambiar los formatos, puede especificar los codificadores:

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

Para elegir manualmente secuencias específicas

A veces, la selección de transmisión predeterminada no le dará el resultado que desea. En este ejemplo video.mp4tiene video y audio, y audio.m4asolo tiene audio. Use -mappara elegir video video.mp4y audio de audio.m4a:

ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4
  • -map 0:v- Desde la entrada 0(la primera entrada, que es video.mp4), elija la v(s) secuencia (s) ideo.
  • -map 1:a- Desde la entrada 1(la segunda entrada, que es audio.m4a), elija las asecuencias de audio.

Mezclar / combinar dos entradas de audio en una

Tome videos de video.webmy use el filtro de combinación para combinar el audio de video.webmy 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

Generar audio silencioso

Puede usar el filtro anullsrc para hacer una transmisión de audio silenciosa. El filtro le permite elegir el diseño de canal deseado (mono, estéreo, 5.1, etc.) y la frecuencia de muestreo.

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

Ver también

lema
fuente
55
Al principio esto no funcionó para mí, pero usarlo en -map 0:0 -map 1:0lugar de -map 0 -map 1hacerlo me funcionó. ¡Gracias!
yonix
Esto inserta un marco vacío al principio.
Lenar Hoyt
He probado este comando, pero pierdo el audio del video. mi formato de video es mp4
Allan
@ Allan.Chan La pregunta original no quería el audio de la entrada de video, pero agregué otro ejemplo: vea el ejemplo Mezclar / combinar otra entrada de audio .
llogan
La primera solución sin la -shortestopción funcionó mejor para mí.
mmj
24

música mp3 a wav

ffmpeg -i music.mp3 music.wav

truncar para ajustar el video

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

mezclar música y video

ffmpeg -i musicshort.wav -i movie.avi final_video.avi
jwilson
fuente
3
Según recuerdo, la última variante reemplazará el audio antiguo por uno nuevo.
Vetalll
¿Hay alguna opción para fusionar audio nuevo con audio antiguo?
Iqbal Malik
1
@jwilson, he probado este comando, pero pierdo el audio del video. mi formato de video es mp4
Allan
@Allan solución para no perder?
Kiquenet
20

Si el video de entrada tiene varias pistas de audio y necesita agregar una más, use el siguiente comando:

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

-map 0significa copiar (incluir) todas las secuencias del primer archivo de entrada ( input_video_with_audio.avi) y -map 1significa incluir todas las secuencias (en este caso una) del segundo archivo de entrada ( new_audio.ac3).

usuario2513149
fuente
Creo que esta respuesta debe ser la mejor respuesta.
Nabi KAZ
3

Ninguna de estas soluciones me funcionó. Se estaba sobrescribiendo mi audio original, o recibía un error como "no se pudo asignar la memoria" con el ejemplo más complejo de 'amerge'. Parece que necesitaba -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
fuente
1

Nada funcionó para mí (creo que fue porque mi video de entrada .mp4 no tenía ningún audio), así que encontré que esto funcionó para mí:

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

Alexandre Doré
fuente
0

Si está utilizando una versión anterior de FFMPEG y no puede actualizar, puede hacer lo siguiente:

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

Tenga en cuenta que usé -vcodec

Waqleh
fuente
0

Código para agregar audio a video usando ffmpeg.

Si la duración del audio es mayor que la duración del video, se reducirá la duración del audio al video. Si desea audio completo en video, elimine -shortest del 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());
            }


        }
Verdugo
fuente
¿Qué es Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");?
Kiquenet