Como posso criar um arquivo de vídeo a partir de um conjunto de imagens jpg? [duplicado]

30

Eu estou tentando criar um arquivo de vídeo a partir de um conjunto de imagens JPG. Eu adaptei as instruções dadas em esta questão mas tenho experimentado alguns problemas.

Em primeiro lugar, nem todos os pacotes necessários estão disponíveis, mas são substituídos pelo libav-tools, que já está instalado - por isso acho que não é um problema real?

Meus arquivos são nomeados image-NN.jpg (sendo NN um inteiro) e eu usei o comando

avconv -i "image-%d.jpg" -r 25 -c:v libx264 -crf 20  -pix_fmt yuv420p movie.mov

de acordo com a pergunta vinculada, mas isso apenas gera um erro No such file image-%d.jpg . Eu

Eu tentei alterá-lo para

avconv -i "image-*.jpg" -r 25 -c:v libx264 -crf 20  -pix_fmt yuv420p movie.mov

e isso produz um arquivo de vídeo de tamanho 0:00 que parece conter apenas um quadro. (Eu estou supondo que o * usou a primeira partida, em vez de cada partida).

Esta questão dá uma maneira ligeiramente diferente de formatar o nome do arquivo, então eu tentei

avconv -i "image-%02d.jpg" -r 25 -c:v libx264 -crf 20  -pix_fmt yuv420p movie.mov

Isso produz um arquivo maior e faz um vídeo que dura cerca de 3 segundos (aproximadamente o comprimento que eu esperava), mas contém apenas o primeiro quadro.

Outra resposta na primeira pergunta vinculada sugere o uso do ImageMagick, por isso experimentei

convert -delay 1 image-*.jpg output.mp4

Mas isso produziu um erro

convert.im6: delegate failed '"ffmpeg" -v -1 -mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 300 -i "%M%%d.jpg" "%u.%m" 2> "%Z"' @ error/delegate.c/InvokeDelegate/1065.

A versão do avconv é

[email protected] ~/Scott's stop-motion/1 $ avconv -version
avconv version 9.18-6:9.18-0ubuntu0.14.04.1, Copyright (c) 2000-2014 the Libav developers
built on Mar 16 2015 13:19:10 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
avconv 9.18-6:9.18-0ubuntu0.14.04.1
libavutil     52.  3. 0 / 52.  3. 0
libavcodec    54. 35. 0 / 54. 35. 0
libavformat   54. 20. 4 / 54. 20. 4
libavdevice   53.  2. 0 / 53.  2. 0
libavfilter    3.  3. 0 /  3.  3. 0
libavresample  1.  0. 1 /  1.  0. 1
libswscale     2.  1. 1 /  2.  1. 1

Onde estou indo errado e o que preciso fazer?

Adicional: Foi sugerido que eu listasse cada arquivo individualmente, então, com um pouco de Python, eu o criei

avconv -i image-01.jpg image-02.jpg image-03.jpg image-04.jpg image-05.jpg image-06.jpg image-07.jpg image-08.jpg image-09.jpg image-10.jpg image-11.jpg image-12.jpg image-13.jpg image-14.jpg image-15.jpg image-16.jpg image-17.jpg image-18.jpg image-19.jpg image-20.jpg image-21.jpg image-22.jpg image-23.jpg image-24.jpg image-25.jpg image-26.jpg image-27.jpg image-28.jpg image-29.jpg image-30.jpg image-31.jpg image-32.jpg image-33.jpg image-34.jpg image-35.jpg image-36.jpg image-37.jpg image-38.jpg image-39.jpg image-40.jpg image-41.jpg image-42.jpg image-43.jpg image-44.jpg image-45.jpg image-46.jpg image-47.jpg image-48.jpg image-49.jpg image-50.jpg image-51.jpg image-52.jpg image-53.jpg image-54.jpg image-55.jpg image-56.jpg image-57.jpg image-58.jpg image-59.jpg image-60.jpg image-61.jpg image-62.jpg image-63.jpg image-64.jpg image-65.jpg image-66.jpg image-67.jpg image-68.jpg image-69.jpg image-70.jpg image-71.jpg image-72.jpg image-73.jpg image-74.jpg image-75.jpg image-76.jpg image-77.jpg image-78.jpg image-79.jpg image-80.jpg image-81.jpg image-82.jpg image-83.jpg image-84.jpg image-85.jpg image-86.jpg image-87.jpg image-88.jpg  -r 25 -c:v libx264 -crf 20  -pix_fmt yuv420p movie.mov

Isso teve o mesmo efeito que o anterior - apenas o primeiro quadro é usado.

Adicional: Esta questão foi sugerida como uma possível duplicata, mas se refere à aquisição de imagens usando uma webcam conectada a um PC. Este não é o problema que estou tendo. Eu já tenho as fotos; eles foram tirados com uma câmera digital comum.

    
por Carl H 18.04.2015 / 17:36

1 resposta

40

Este é o comando todos juntos:

ffmpeg -framerate 25 -i image-%05d.jpg -c:v libx264 -profile:v high -crf 20 -pix_fmt yuv420p output.mp4

Deixe-me esclarecer:

-framerate

é o número de quadros (imagens) por segundo

-i scene_%05d.jpg

isso determina a sequência de nomes de arquivos que procura. image- significa que todos os arquivos começam com isso. 0 é o número repetido e 5 é o número de vezes (por isso, ele está procurando por qualquer arquivo que comece em image-00000.jpg . O d está solicitando a contagem em números inteiros, portanto os arquivos serão detectar são tudo de image-00001 a image-99999 .

-c:v libx264 -profile:v high -crf 20 -pix_fmt yuv420p

-c:v libx264 - o codec de vídeo é libx264 (H.264).

-profile:v high - use o H.264 High Profile (recursos avançados, melhor qualidade).

-crf 20 - modo de qualidade constante, qualidade muito alta (números menores são de maior qualidade, 18 são os menores que você gostaria de usar).

-pix_fmt yuv420p - use o formato de pixel YUV e 4: 2: 0 Subamostragem de croma

output.mp4

O nome do arquivo ( output.mp4 )

Lembre-se de que ffmpeg precisa de uma seqüência contínua de imagens para carregar. Se ele pular de image-00001 para image-00003 , ele será interrompido.

Se as imagens são assim:

image-1
image-2
...
image-35

altere a parte -i para -i image-%00d .

Atualizar. Sua edição diz que o padrão é image-01.jpg to image-02.jpg . Isso significa que você precisa do padrão image-%02d.jpg .

    
por Tim 18.04.2015 / 20:31

Tags