Seleciona o áudio do segundo arquivo de entrada para a sobreposição de filme ffmpeg

0

Estou trabalhando em este exemplo do wiki ffmpeg

ffmpeg
    -i 1.avi -i 2.avi -i 3.avi -i 4.avi
    -filter_complex "
        nullsrc=size=640x480 [base];
        [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];
        [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];
        [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];
        [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
        [base][upperleft] overlay=shortest=1 [tmp1];
        [tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
        [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
        [tmp3][lowerright] overlay=shortest=1:x=320:y=240
    "
    -c:v libx264 output.mkv

O problema é que sempre leva o áudio do primeiro filme . Como posso, por exemplo, ter o áudio vindo do segundo filme?

Adicionar o Channelmap no -filter_complex parece ser o caminho a percorrer, mas não consigo descobrir como referenciar faixas nos filmes.

Eu tentei variações sobre isso:

channelmap=map=0.0.0=1.0.0|0.0.1=1.0.1

Mas dá erros de sintaxe.

    
por Stan James 25.10.2015 / 22:09

1 resposta

1

Você pode usar a -map opção . Caso contrário, você estará limitado ao comportamento padrão seleção de fluxo , que pode não escolher o que você deseja.

Exemplo

Isso mapeará o áudio da segunda entrada ( 2.avi ):

-map 1:a
  • Como ffmpeg começa a contar a partir de 0, o primeiro ID de entrada é 0, o segundo é 1, o terceiro é 2, etc.

  • Se a segunda entrada tiver vários fluxos de áudio, isso mapeará todos eles. Se, por exemplo, você quiser apenas o quarto fluxo de áudio da segunda entrada, use -map 1:a:3 .

Com filtragem

Eu tenho a tendência de informar explicitamente ffmpeg qual fluxo usar para evitar ambigüidade em vez de confiar nos padrões. Então, seu comando pode parecer com este exemplo abaixo:

ffmpeg
    -i 1.avi -i 2.avi -i 3.avi -i 4.avi
    -filter_complex "
        nullsrc=size=640x480 [base];
        [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];
        [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];
        [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];
        [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
        [base][upperleft] overlay=shortest=1 [tmp1];
        [tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
        [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
        [tmp3][lowerright] overlay=shortest=1:x=320:y=240[v]
    "
    -map "[v]" -map 1:a -c:v libx264 -shortest output.mkv
  • Observe as duas instâncias do [v] e do 1:a : elas mapearão o vídeo do filtro e o áudio da segunda entrada ( 2.avi ).

  • Eu adicionei -shortest para garantir que a saída termine quando a entrada mais curta terminar ( [v] ou 1:a ).

por 26.10.2015 / 00:04

Tags