Como posso usar o ffmpeg para adicionar música a um vídeo que está sendo construído a partir de imagens individuais com -filter_complex?

0

Estou usando -filter_complex para criar um vídeo com várias imagens e combiná-las. Isso está funcionando bem. Agora eu gostaria de adicionar uma faixa de áudio ao vídeo, o comando falha. Como posso adicionar áudio a este arquivo de vídeo que estou gerando?

Aqui está o que estou fazendo que não está funcionando:

ffmpeg \
-i sunlight.mp3 \
-loop 1 -t 1 -i 1.jpg \
-loop 1 -t 1 -i 2.jpg \
-loop 1 -t 1 -i 3.jpg \
-loop 1 -t 1 -i 4.jpg \
-loop 1 -t 1 -i 5.jpg \
-filter_complex \
"[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; \
[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; \
[3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; \
[4:v][3:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b4v]; \
[0:v][b1v][1:v][b2v][2:v][b3v][3:v][b4v][4:v]concat=n=9:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Aqui está a saída do ffmpeg:

    ffmpeg version 3.1.3 Copyright (c) 2000-2016 the FFmpeg developers
        built with Apple LLVM version 7.3.0 (clang-703.0.31)
        configuration: --prefix=/usr/local/Cellar/ffmpeg/3.1.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libxvid --disable-lzma --enable-vda
        libavutil      55. 28.100 / 55. 28.100
        libavcodec     57. 48.101 / 57. 48.101
        libavformat    57. 41.100 / 57. 41.100
        libavdevice    57.  0.101 / 57.  0.101
        libavfilter     6. 47.100 /  6. 47.100
        libavresample   3.  0.  0 /  3.  0.  0
        libswscale      4.  1.100 /  4.  1.100
        libswresample   2.  1.100 /  2.  1.100
        libpostproc    54.  0.100 / 54.  0.100
    Input #0, mp3, from 'sunlight.mp3':
        Metadata:
            encoder         : Lavf57.41.100
        Duration: 00:02:05.68, start: 0.025057, bitrate: 128 kb/s
            Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s
            Metadata:
                encoder         : Lavc57.48
    Input #1, image2, from '1.jpg':
        Duration: 00:00:00.04, start: 0.000000, bitrate: 42613 kb/s
            Stream #1:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1200x900 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
    Input #2, image2, from '2.jpg':
        Duration: 00:00:00.04, start: 0.000000, bitrate: 44551 kb/s
            Stream #2:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1200x900 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
    Input #3, image2, from '3.jpg':
        Duration: 00:00:00.04, start: 0.000000, bitrate: 40433 kb/s
            Stream #3:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1200x900 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
    Input #4, image2, from '4.jpg':
        Duration: 00:00:00.04, start: 0.000000, bitrate: 57157 kb/s
            Stream #4:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1200x900 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
    Input #5, image2, from '5.jpg':
        Duration: 00:00:00.04, start: 0.000000, bitrate: 51745 kb/s
            Stream #5:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1200x900 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
    Stream specifier ':v' in filtergraph description [1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; [2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; [3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; [4:v][3:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b4v]; [0:v][b1v][1:v][b2v][2:v][b3v][3:v][b4v][4:v]concat=n=9:v=1:a=0,format=yuv420p[v] matches no streams.

Quando executo o comando sem o -i sunlight.mp3 , ele funciona bem.

    
por jergason 06.10.2016 / 23:22

2 respostas

4

Você tem dois métodos para tentar:

Defina manualmente os fluxos de saída com -map

Eu geralmente recomendo mapear manualmente seus fluxos em vez de confiar no comportamento de seleção de fluxo padrão para que você não obtenha resultados inesperados, mas isso requer que você:

  1. Etiquete suas saídas de filtro como você fez com o [v]
  2. Use -map

Exemplo:

ffmpeg \
-loop 1 -t 1 -i 1.jpg \
-loop 1 -t 1 -i 2.jpg \
-loop 1 -t 1 -i 3.jpg \
-loop 1 -t 1 -i 4.jpg \
-loop 1 -t 1 -i 5.jpg \
-i sunlight.mp3 \
-filter_complex \
"[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; \
[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; \
[3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; \
[4:v][3:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b4v]; \
[0:v][b1v][1:v][b2v][2:v][b3v][3:v][b4v][4:v]concat=n=9:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

Os valores do especificador de fluxo que você usa em seu filtergraph e nas suas -map options dependem da ordem de suas entradas.

Use o comportamento de seleção de fluxo padrão

Como sua saída final contém apenas um fluxo de vídeo e um fluxo de áudio, você pode omitir -map e o rótulo de saída ( [v] ) e usar apenas o comportamento padrão de seleção de fluxo . Esse pode ser o método mais fácil de usar se você estiver fazendo um script.

ffmpeg \
-loop 1 -t 1 -i 1.jpg \
-loop 1 -t 1 -i 2.jpg \
-loop 1 -t 1 -i 3.jpg \
-loop 1 -t 1 -i 4.jpg \
-loop 1 -t 1 -i 5.jpg \
-i sunlight.mp3 \
-filter_complex \
"[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; \
[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; \
[3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; \
[4:v][3:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b4v]; \
[0:v][b1v][1:v][b2v][2:v][b3v][3:v][b4v][4:v]concat=n=9:v=1:a=0,format=yuv420p" -shortest out.mp4
    
por 06.10.2016 / 23:56
2

Seu script tem dois erros básicos:

  1. na primeira cadeia de filtros (consulte a primeira linha de filter_complex ) você especifica 0:v como um fluxo de entrada. mas como a saída ffmpeg diz: Stream specifier ':v' in filtergraph description ... matches no streams. não há fluxo de vídeo no arquivo 0 . Observe que você envia um arquivo mp3 como sua primeira entrada. coloque-o como último arquivo de entrada e ...

  2. Adicione um -map 5:a antes do nome do arquivo de saída.Você especificou o fluxo de vídeo [v] como seu único fluxo de saída. Ao usar a opção -map , você deve definir todos os fluxos de saída com isso.

por 07.10.2016 / 00:59