Converter quadros PNG em vídeo a 1 FPS

15

Eu tenho quadros de vídeo no formato PNG a 1 FPS e estou tentando convertê-los em um vídeo usando o ffmpeg.

Se eu fizer algo assim:

ffmpeg -i data/input-%4d.png data/output.mp4

Eu recebo um vídeo a 25FPS que é basicamente um avanço muito rápido da entrada (que é capturada em 1FPS).

Se eu tentar:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

Eu recebo algo que o VLC não quer jogar:)

Agora, se eu pegar o primeiro vídeo (o FF) e aplicar um filtro para diminuí-lo (por exemplo, -filter:v 'setpts=24.0*PTS' ), posso reproduzi-lo como um vídeo de 1 FPS, mas é claro que o preço é de arquivo Tamanho. Está gerando um monte de quadros repetidos, eu acho.

Então, a questão é como criar um vídeo com exatamente 1 FPS e que seja reproduzido nessa velocidade? O formato de saída, btw, não é tão importante para mim.

    
por Assaf Lavie 22.03.2013 / 07:16

3 respostas

10

Se você quer um one-liner para o FFMPEG que gere um vídeo que reproduz a 1 frame por segundo, o que você quer fazer é especificar taxas de quadros para entrada e saída, assim:

ffmpeg -r 1 -i data/input-%4d.png -pix_fmt yuv420p -r 10 data/output.mp4

O -r 1 significa que o vídeo será reproduzido em uma das imagens originais por segundo.
O -r 10 significa que o vídeo será reproduzido a 10 quadros por segundo.

(O -pix_fmt yuv420p está lá apenas para garantir a compatibilidade com uma ampla gama de programas de reprodução. É necessário, por exemplo, que o vídeo possa ser reproduzido pelo Windows Media Player.)

Eu testei muitas taxas de quadros de saída diferentes, e 10 parece ser o número mais baixo que você pode usar e ainda produzirá um vídeo que o VLC irá reproduzir.

Naturalmente, o comando acima significa que cada imagem original está sendo multiplicada, mas é um método mais simples do que o que você mencionou e, dependendo do codec, pode não produzir um vídeo muito maior que um verdadeiro. Vídeo de 1 FPS.

Para testar isso, acabei de produzir um verdadeiro vídeo de 1-FPS, que saiu para 2,24 kiB. Eu então produzi um vídeo com as mesmas imagens de entrada, mas a saída em 24 FPS, e saiu para 5,76 kiB. Isso é pouco mais do que o dobro do tamanho e nem de perto 24 vezes o tamanho. :)

    
por 16.08.2013 / 02:41
3

E se você aumentar seu segundo exemplo da seguinte forma:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4

O -r 1 precisa vir antes dos arquivos .png, não depois.

Na documentação do FFmpeg :

As a general rule, options are applied to the next specified file. Therefore, order is important, and you can have the same option on the command line multiple times. Each occurrence is then applied to the next input or output file.

    
por 29.06.2013 / 03:16
3

Use -framerate e -r

Por exemplo, para ter um vídeo final que parece 1FPS:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
    -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Isso é semelhante ao que Convertendo quadros PNG em vídeo em 1 FPS | Unix & O Stack Stack do Linux diz, mas eu precisava do -framerate em vez do -r para ele funcionar.

Isso é mencionado no wiki em: link

Define a taxa de quadros de saída como 30 , que o VLC pode manipular, e copia cada imagem 30 vezes, para que o vídeo de saída pareça estar em 1 FPS. Veja também: Problemas de reprodução no VLC com vídeo de baixa fps de imagens usando ffmpeg | Estouro de pilha

O VLC é então capaz de reproduzir o vídeo normalmente.

Testado no Ubuntu 16.10, VLC 2.2.4, ffmpeg 3.0.5, em um diretório com 10 PNGs.

Veja também: link

    
por 23.01.2017 / 01:39