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

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 nueva pista de audio a video (no mezclar).

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

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

Agregar audio a video: copia de secuencia

 ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi 
  • Omitir la opción -map utilizará la selección de transmisión predeterminada. Esto funcionará si su entrada de video no tiene audio.
  • Este ejemplo usa -codec copy to stream copy (sin reencoding; la calidad se conserva y es rápida).
  • La opción más -shortest hará que output.avi la misma duración que la entrada más corta.

Agregar audio a video: volver 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 flujos específicos

En ocasiones, la selección de transmisión predeterminada no le dará el resultado que desea. En este ejemplo, video.mp4 tiene video y audio, y audio.m4a solo tiene audio. Use -map para elegir video de video.mp4 y 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 – De la entrada 0 (la primera entrada, que es video.mp4 ) elije las v ideo secuencia (s).
  • -map 1:a – De la entrada 1 (la segunda entrada, que es audio.m4a ) elije la (s) transmisión (es) de audio.m4a .

Mezclando / combinando dos entradas de audio en una

Toma video de video.webm , y usa el filtro de amerge para combinar el audio de video.webm y 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 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

  • Combina dos transmisiones de audio en una
  • FFmpeg Wiki: Manipulación del canal de audio
  • FFmpeg mux video y audio de otro video

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 

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

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

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

Ninguna de estas soluciones funcionó para mí. Se sobrescribió mi audio original o recibí un error como “error al mapear 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 

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 utilicé -vcodec

Código para agregar audio a video usando ffmpeg.

Si la duración del audio es mayor que la duración del video, reducirá el audio a la duración del video. Si quieres audio completo en video, quita -distinto 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()); } }