Como substituir um fluxo de áudio em um arquivo de vídeo por vários fluxos de áudio?

19

Quero substituir o segundo fluxo de áudio (0: 2) em um arquivo de vídeo que tenha dois fluxos de áudio e atribuir um rótulo, se possível. Como eu iria fazer isso? Todos os comandos ffmpeg que encontrei não me permitem manter o segundo fluxo de áudio.

Anônimo
fonte

Respostas:

22

Use a -mapopção para escolher seus fluxos. A seleção de fluxo padrão escolherá apenas um de cada tipo de fluxo; é por isso -mapque deve ser usado.

Substitua o segundo fluxo de áudio

insira a descrição da imagem aqui

ffmpeg -i video.mkv -i audio.mp3 -map 0:v -map 0:a:0 -map 1:a \
-metadata:s:a:0 language=eng -metadata:s:a:1 language=sme -codec copy \
-shortest output.mkv
  • 0:v- O 0refere-se à primeira entrada que é video.mkv. O vmeio "selecione o tipo de fluxo de vídeo".

  • 0:a:0- O 0refere-se à primeira entrada que é video.mkv. O ameio "selecione o tipo de fluxo de áudio". O último 0refere-se ao primeiro fluxo de áudio desta entrada. Se apenas 0:afor usado, todos os fluxos de vídeo serão mapeados.

  • 1:a- O 1refere-se à segunda entrada que é audio.mp3. O ameio "selecione o tipo de fluxo de áudio".

  • -codec copyvai transmitir cópia (re-MUX) em vez de codificar. Se você precisar de um codec de áudio específico, especifique -c:v copy(para manter o vídeo) e, por exemplo, -c:a libmp3lamepara recodificar o fluxo de áudio em MP3.

  • -shortest finalizará a saída quando a entrada mais curta terminar.

Combine dois fluxos de áudio em um

insira a descrição da imagem aqui

ffmpeg -i vid.mkv -i aud.mp3 -filter_complex "[0:a][1:a]amerge=inputs=2[a]" \
-map 0:v -map "[a]" -c:v copy -c:a aac -strict experimental -b:a 192k -ac 2 \
-shortest out.mp4
  • A filtragem requer recodificação e o amergefiltro é usado aqui, para que o áudio não possa ser copiado em fluxo neste exemplo.
llogan
fonte
não funcionou para mim.
Rudolf Olah
@omouse "não funcionou" é difícil de fornecer ajuda. Você deve usar um link pastebin para mostrar seu comando e a saída completa do console.
llogan
Meu problema é o -codec copy, mas eu consertei isso (versão diferente do ffmpeg), o outro problema que tive foi com o -map, ele reclamou do número errado de fluxos.
Rudolf Olah
11
Eu apenas usei -map 0:v -map 1:a. Suponho que isso significa tirar o vídeo do primeiro arquivo (video.mkv) e depois pegar o áudio do segundo arquivo (audio.mp4) para criar output.mkv ... Não sei ao certo o que -map 0:a:0é isso. Excluí-o e obtenho os resultados desejados.
Sun
2
@ aaronk6 A pergunta original solicitou uma maneira de mapear vários fluxos de áudio para a saída. O exemplo pega o primeiro fluxo de áudio da primeira entrada e o (s) fluxo (s) de áudio da segunda entrada e os mapeia para a saída. Parece que alguns estão assumindo que o exemplo produz uma saída com um único fluxo de áudio e depois é confundido.
llogan