Como adicionar um novo áudio (sem mixar) a um vídeo usando ffmpeg?

131

Eu usei um comando como:

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

na versão mais recente para adicionar nova faixa de áudio ao vídeo (não mixar).

Mas atualizei o ffmpeg para a versão mais recente (versão ffmpeg git-2012-06-16-809d71d ) e agora nesta versão o parâmetro -newaudionão funciona.

Diga-me, por favor, como posso adicionar novo áudio ao meu vídeo (não mixar) usando ffmpeg.

Vetalll
fonte
@Kiquenet Sim, você está certo. E a resposta já está dada. Basta ler este tópico. Esta pergunta tem 5 anos.
Vetalll
Ao adicionar novo áudio, você quer dizer substituir o áudio, certo? Eu posso editar sua pergunta para deixar isso claro.
tommy.carstensen

Respostas:

295

Adicionar áudio ao vídeo: copiar cópia

ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
  • Omitir a -mapopção utilizará a seleção de fluxo padrão . Isso funcionará se sua entrada de vídeo não tiver áudio.
  • Este exemplo usa -codec copypara transmitir cópia (sem recodificação; a qualidade é preservada e é rápida).
  • A -shortestopção terá output.avia mesma duração que a menor entrada.

Adicione áudio ao vídeo: recodifique

Se sua saída não gostar dos formatos originais ou se você quiser alterar os formatos, poderá especificar os codificadores:

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

Para escolher manualmente fluxos específicos

Às vezes, a seleção de fluxo padrão não fornece o resultado desejado. Neste exemplo, video.mp4tem vídeo e áudio e audio.m4aapenas áudio. Use -mappara escolher o vídeo video.mp4e o áudio de audio.m4a:

ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4
  • -map 0:v- Na entrada 0(a primeira entrada, que é video.mp4), escolha o v(s) fluxo (s) de vídeo.
  • -map 1:a- Na entrada 1(a segunda entrada, que é audio.m4a), escolha o a(s) fluxo (s) de áudio.

Misturando / combinando duas entradas de áudio em uma

Grave vídeos de video.webme use o filtro amerge para combinar o áudio de 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

Gere áudio silencioso

Você pode usar o filtro anullsrc para criar um fluxo de áudio silencioso. O filtro permite escolher o layout de canal desejado (mono, estéreo, 5.1, etc) e a taxa de amostragem.

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

Veja também

llogan
fonte
5
Isso não funcionou para mim no começo, mas usar em -map 0:0 -map 1:0vez de -map 0 -map 1fez o truque para mim. Obrigado!
Yonix 7/09/13
Isso insere um quadro vazio no início.
Lenar Hoyt
Eu tentei este comando, mas perdi o áudio do vídeo. o meu formato de vídeo é mp4
Allan
@ Allan.Chan A pergunta original não queria o áudio da entrada de vídeo, mas adicionei outro exemplo: veja o exemplo de Mixagem / combinação de outra entrada de áudio .
Llogan 15/08/2015
A 1ª solução sem a -shortestopção funcionou melhor para mim.
MMJ
24

música mp3 para wav

ffmpeg -i music.mp3 music.wav

truncar para caber no vídeo

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

misture música e vídeo

ffmpeg -i musicshort.wav -i movie.avi final_video.avi
jwilson
fonte
3
pelo que me lembro, a última variante substituirá o áudio antigo por novo.
Vetalll
Existe alguma opção para mesclar novo áudio com áudio antigo?
Iqbal Malik
1
@ jwilson Eu tentei este comando, mas perco o áudio do vídeo. o meu formato de vídeo é mp4
Allan
Solução @Allan para não perder?
Kiquenet
20

Se o vídeo de entrada tiver várias faixas de áudio e você precisar adicionar mais uma, use o seguinte 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) todos os fluxos do primeiro arquivo de entrada ( input_video_with_audio.avi) e -map 1significa incluir todos os fluxos (neste caso, um) do segundo arquivo de entrada ( new_audio.ac3).

user2513149
fonte
Eu acho que essa resposta deve ser a melhor resposta.
Nabi KAZ
3

Nenhuma dessas soluções funcionou para mim. Meu áudio original estava sendo substituído ou eu estava recebendo um erro como "falha ao mapear memória" com o exemplo mais complexo de 'amerge'. Parece que eu precisava 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
fonte
1

Nada funcionou muito bem para mim (acho que foi porque meu vídeo .mp4 de entrada não tinha áudio), então achei que funcionou para mim:

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

Alexandre Doré
fonte
0

Se você estiver usando uma versão antiga do FFMPEG e não puder atualizar, poderá fazer o seguinte:

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

Observe que eu usei -vcodec

Waqleh
fonte
0

Código para adicionar áudio ao vídeo usando ffmpeg.

Se a duração do áudio for maior que a duração do vídeo, o áudio será cortado na duração do vídeo. Se você quiser áudio completo em vídeo, remova -shortest do 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());
            }


        }
Carrasco
fonte
O que é Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");?
Kanjet