Questão Como criar um vídeo a partir de imagens usando o FFmpeg?


É possível usar ffmpeg criar um vídeo a partir de um conjunto de seqüências, onde o número não começa do zero?

Por exemplo, tenho algumas imagens [test_100.jpg, test_101.jpg, test_102.jpg, ..., test_200.jpg] e quero convertê-las em um vídeo. Eu tentei o seguinte comando, mas não funcionou (parece que o número deve começar do zero):

ffmpeg -i test_% d.jpg -vcodec mpeg4 test.avi

Qualquer conselho?


80


origem


Já faz um tempo desde que você perguntou isso, mas se você ainda está interessado na pergunta, a resposta é SIM - Eu postei os detalhes e um exemplo abaixo: stackoverflow.com/a/12160155/181638 - Assad Ebrahim
@casperOne seria útil para ter uma ideia do porquê isto está fora do assunto. Parece um problema de programação específico. A tag FFmpeg tem 3.7k seguidores, e com 27k visualizações claramente as pessoas acham útil .. - geotheory
@geotheory As estatísticas das tags são irrelevantes. ffmpeg é um programa muito no caminho de dizer, WinRar. Enquanto você pode programar contra o bibliotecas dentro ffmpegesta questão não é sobre isso. Usando ffmpeg da linha de comando é para ser perguntado sobre Superusuário, onde está no tópico. - casperOne


Respostas:


Não há necessidade de renomear arquivos se usar o -start_number alternar assim:

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

Onde n é o começo da seqüência de fotos.

Observe que isso funcionará enquanto a sequência não estiver quebrada quando for iniciada. Se houver lacunas e você quiser todas as fotos incluídas, renumeração pode ser necessária para preencher as lacunas.

Existem alguns outros switches que você pode achar úteis.

Eu uso o seguinte liner para obter uma taxa de quadros mais lenta e compactar as imagens e ter um vídeo resultante menor:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 
        -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

o -r 3 opção define a taxa de quadros do vídeo resultante para 3 quadros por segundo, de modo que eu possa ver cada foto por um curto período de tempo. o -s opção redimensiona as imagens para a resolução desejada para gerenciar o tamanho do vídeo resultante.

(No shell do Windows, substitua -i Imgp%04d.jpg com -i "Imgp%%04d.jpg". Crédito por isso para Mike Fitzpatrick https://superuser.com/a/344178/153054)


70



qual a diferença entre -r e -framerate?
eles são o mesmo IIRC - rogerdpack
Não há necessidade de nonsense de numeração, contanto que você esteja feliz em aceitar a ordem em que aparecem em (digamos) 'ls' ... basta usar: ffmpeg -pattern_type glob -i '* .jpg' movie.mp4 - Orwellophile
Existe algum interruptor para controlar o Tempo gap entre imagens, digamos, eu gostaria de mostrar a primeira imagem 13s, o segundo 15s, 24s para o terceiro, o intervalo de tempo é definido pelo usuário, isso é possível? - zionpi
Veja também trac.ffmpeg.org/wiki/… - d3vid


Você pode usar este snippet de código abaixo:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4

33



Isso não gira os JPGs para a rotação indicada nos metadados. - Erik Johansson


Você pode encontrar um script de exemplo no documentação do ffmpeg:

3.2 Como codifico imagens individuais em filmes?

Se você tem um grande número de fotos para renomear, você pode usar o seguinte comando para aliviar a carga. O comando, usando a sintaxe do shell bourne, simbolicamente liga todos os arquivos no diretório atual que correspondem * jpg ao /tmp' directory in the sequence ofimg001.jpg ', `img002.jpg' e assim por diante.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

Então corra:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg

17



Seria melhor que você fizesse x = 0 para começar, assim o nome da imagem começaria img000.jpg, pois é isso que o ffmpeg espera. Também o symlinking não funcionou para mim já que o ffmpeg não conseguiu encontrar os arquivos, então eu tive que usar o cp no lugar (óbvio que a velocidade e o espaço puxam para trás, mas eu os rimo depois de qualquer maneira). O mv também funcionaria se você não se importasse de perder os originais.
Observe que, nessa resposta, o comando fornecido cria hardlinks, e não links simbólicos. Em relação ao uso de cp se a ligação não funcionar, se o seu sistema de arquivos o suportar cp --reflink=auto vai conseguir muito melhor uso de velocidade / espaço. - Félix Saparelli


Tanto quanto eu sei, você não pode iniciar a seqüência em números aleatórios (não lembro se você deve iniciá-lo em 0 ou 1), além disso, ele não pode ter lacunas, se isso acontecer, ffmpeg assumirá que a sequência acabou e Pare de adicionar mais imagens.

Além disso, conforme declarado nos comentários da minha resposta, lembre-se de que você precisa especificar a largura do seu índice. Gostar:

image% 03d.jpg

E se você usar um tipo de índice% 03d, precisará preencher seus nomes de arquivos com 0, como:

image001.jpg image002.jpg image003.jpg

etc.


11



Se os nomes dos arquivos de imagem tiverem zeros à esquerda, a string de formatação também deverá especificar a largura como "% 03d".
Se esse é o único obstáculo, você poderia simplesmente escrever um script para renomear ou vincular suas imagens a um conjunto apropriadamente reindexado. - Cascabel
Sim, eu trabalhei com isso antes, eu escrevi um wrapper em Ruby há um tempo atrás, onde você chamou instance.addImage (), instance.processVideo () e criaria um diretório temporal, copiar / renomear as imagens com índices apropriados e crie o vídeo. É muito fácil.
@Jefromi Eu criei um link simbólico, mas como faço para dar o caminho do arquivo symlink para ffmpeg? Apenas assume que o arquivo de link simbólico é a imagem que estou tentando converter? Eu estou no win7 btw
A sequência pode começar de 0 a 4 inclusive. - Assad Ebrahim


A partir de docs do ffmpeg:

Usando um padrão glob

O ffmpeg também suporta globbing estilo bash (* representa qualquer número de qualquer caractere).

Isso é útil se suas imagens forem seqüenciais, mas não necessariamente em ordem numérica sequencial, como nos exemplos anteriores.

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

Então, contanto que seus arquivos sejam classificados, usando o -pattern_type glob switch deve funcionar para você.


9



Observe que esse glob é mais limitado que globs comuns de shell: trac.ffmpeg.org/ticket/3620 aparentemente porque o tipo de imagem é deduzido da extensão. - Ciro Santilli 新疆改造中心 六四事件 法轮功


Eu concordo com Francisco, mas como uma solução alternativa, você poderia simplesmente escrever um script rápido para mover ou criar links simbólicos para os arquivos com os números de sequência que o ffmpeg precisa. O script pode então chamar o ffmpeg e depois remover os links ou mover os arquivos de volta para seus locais originais.


5





olho para cima

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done

1





Eu usei o codificador flv desde que meu vídeo estava indo em um flash player (Jwplayer)

ffmpeg -i% d.jpg -vcodec flv test.flv


0





Você pode fazer isso com convert -morph:

convert *.jpg -delay 10 -morph 10 %05d.jpg

0



Isso é apenas interpolando sua sequência de imagens original para um novo espaço, ele não cria um arquivo de vídeo como o OP perguntou. - f0ster