Comando para criar vídeo a partir de imagens com áudio e vídeo de fundo

0

Estou usando o ffmpeg no meu aplicativo Android. Eu quero criar um vídeo a partir de imagens com áudio e vídeo de fundo. Imagens são sobrepostas em vídeo com bordas. O vídeo e o áudio serão repetidos até que todos os slides não fiquem visíveis.

Este vídeo mostra um exemplo do que eu quero alcançar .

Qual comando eu precisaria para isso? Eu não sei como escrever comandos ffmpeg.

No meu aplicativo, o usuário pode selecionar as imagens de uma galeria. Usando as imagens selecionadas eu tenho que criar um vídeo, cada imagem será mostrada por 5 segundos. Eu tenho um vídeo e áudio de pequena duração (como mostrado em vídeo vinculado, por exemplo, o vídeo de fogo), que será repetido até que todos os slides sejam exibidos.

    
por Mandy Crisley 31.03.2015 / 10:20

1 resposta

1

Isso é possível, mas exigirá scripts adicionais por causa do número variável de imagens selecionadas e também devido à falta de uma opção de loop real para entradas de vídeo e áudio.

Esta resposta fornece alguns exemplos , mas você tem o requisito adicional de fazer um loop de fluxo de vídeo e áudio.

Aqui estão alguns exemplos que você pode adaptar e desenvolver. O script vai depender de você.

Exemplo 1

Este exemplo está assumindo que:

  • Todas as entradas de imagem têm o mesmo tamanho de quadro. Esse é um requisito, caso contrário, problemas de tempo podem ocorrer .

  • Todas as entradas de imagem são nomeadas img001.jpg , img002.jpg , img003.jpg , etc. Alternativamente, você pode usar um padrão glob conforme descrito no documentação do demuxer do arquivo de imagem .

ffmpeg -i video.mkv -i audio.mp3 -framerate 1/5 -i img%03.jpg -filter_complex \
"[0:v]setpts=PTS-STARTPTS[vid]; \
 [vid][vid][vid]concat=n=3:v=1:a=0[bg]; \
 [1:a][1:a][1:a]concat=n=3:v=0:a=1[a]; \
 [2:v]drawbox=t=5:c=white[fg]; \
 [bg][fg]overlay=(W-w)/2:(H-h)/2,format=yuv420p[v]" \
-map "[v]" -map "[a]" -shortest output.mp4

Exemplo 2

Outro método é listar explicitamente cada imagem como uma entrada separada. Isso pode permitir que você execute qualquer dimensionamento, se necessário, mas torna o comando ainda mais complexo:

ffmpeg -i video.mkv -i audio.mp3 -loop 1 -i hound.jpg -loop 1 -i crow.jpg \
-loop 1 -i donkey.png -filter_complex \
"[0:v]setpts=PTS-STARTPTS[vid]; \
 [vid][vid][vid]concat=n=3:v=1:a=0[bg]; \
 [1:a][1:a][1:a]concat=n=3:v=0:a=1[a]; \
 [2:v]trim=duration=5,scale=640:360,drawbox=t=5:c=white[fg0]; \
 [3:v]trim=duration=5,scale=640:360,drawbox=t=5:c=white[fg1]; \
 [4:v]trim=duration=5,scale=640:360,drawbox=t=5:c=white[fg2]; \
 [bg][fg0]overlay=(W-w)/2:(H-h)/2[ol0]; \
 [ol0][fg1]overlay=(W-w)/2:(H-h)/2[ol1]; \
 [ol1][fg2]overlay=(W-w)/2:(H-h)/2,format=yuv420p[v]" \
-map "[v]" -map "[a]" -shortest output.mp4

Existem várias respostas no Superusuário que fornecem exemplos de escalonamento mais complexos. Este exemplo é simples, mas pode resultar em imagens de saída comprimidas ou esticadas se as imagens de entrada variarem na proporção.

O que você precisa para determinar

Para ambos os métodos, com base em quantas imagens o usuário selecionar e a duração do vídeo e do áudio, você terá que determinar quantos segmentos são necessários para o concat filtrar para fornecer um loop apropriado.

Você pode ter alguns problemas. O demuxer de imagens e concat são algumas vezes meticulosos.

    
por 01.04.2015 / 01:38