Tenho quadros de vídeo no formato PNG a 1 FPS e estou tentando convertê-los em um vídeo usando 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 a 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 abrandá-lo (por exemplo -filter:v 'setpts=24.0*PTS'
), posso fazê-lo tocar como um vídeo de 1 FPS, mas é claro que o preço é o tamanho do arquivo. 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.
fonte
ffmpeg
é inteligente o suficiente para descobrir o codec de vídeo apenas na extensão de arquivo no formato container.mp4
. Tente adicionar-vcodec libx264 -vpre hq
à linha de comando, para informar os parâmetros de codec e codificação.-r 1
.Respostas:
Se você deseja uma linha única para o FFMPEG que gera um vídeo que é reproduzido a 1 quadro por segundo, o que você deseja fazer é especificar as taxas de quadros para a entrada e a saída, assim:
Os
-r 1
meios que o vídeo será reproduzido em 1 das imagens originais por segundo.Os
-r 10
meios que o vídeo será reproduzido a 10 quadros por segundo.(
-pix_fmt yuv420p
Está disponível para garantir a compatibilidade com uma ampla variedade de programas de reprodução. É necessário aqui, por exemplo, para que o vídeo seja reproduzido pelo Windows Media Player.)Testei muitas taxas de quadros de saída diferentes e 10 parece ser o número mais baixo que você pode usar que ainda produzirá um vídeo que o VLC reproduzirá.
Obviamente, o comando acima significa que cada imagem original está sendo multiplicada, mas é um método mais simples do que o "abrandar" que você mencionou e, dependendo do codec, pode não produzir um vídeo muito maior que um verdadeiro 1-FPS vídeo.
Para testar isso, acabei de produzir um verdadeiro vídeo de 1 FPS, que chegou a 2,24 kiB. Em seguida, produzi um vídeo com as mesmas imagens de entrada, mas com saída a 24 FPS, e saiu para 5,76 kiB. Isso é apenas o dobro do tamanho, e nem perto de 24 vezes o tamanho. :)
fonte
Use ambos
-framerate
e-r
Por exemplo, para ter um vídeo final parecido com 1FPS:
É semelhante ao que Converter quadros PNG em vídeo a 1 FPS | O Unix e Linux Stack Exchange diz, mas eu precisava, em
-framerate
vez de-r
funcionar.Isso é mencionado no wiki em: http://trac.ffmpeg.org/wiki/Slideshow#Framerates
Ele define a taxa de quadros de saída para a
30
qual 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 taxa de quadros por segundo usando ffmpeg | Estouro de pilhaO VLC pode então 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.Consulte também: /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg
fonte
-r
e-framerate
?man
páginas, avise-me ;-) Uma citação significativa é "-r opção de entrada, ignore os registros de data e hora armazenados no arquivo e gere registros de data e hora assumindo taxa de quadros constante fps.Não é o mesmo que a opção -framerate usada para alguns formatos de entrada como image2 ou v4l2 (costumava ser o mesmo em versões anteriores do FFmpeg). Em caso de dúvida, use -framerate em vez da opção de entrada -r. "E se você aumentar um pouco o segundo exemplo da seguinte maneira:
As
-r 1
necessidades vêm antes dos arquivos .png, não depois.Na documentação do FFmpeg :
fonte
Este é um erro no VLC (que ainda existe na versão 3.0.6). Após algumas experiências, percebi que o VLC falha em vídeos com FPS menor que 10 . Portanto, todos os vídeos com 10 FPS ou mais não devem ser um problema. Portanto, atualmente não há uma maneira limpa de obter um vídeo com 1 FPS que pode ser reproduzido no VLC ( não desista, continue lendo ).
Uma solução alternativa é, como mostrado na resposta acima, falsificar o efeito de 1 FPS duplicando as imagens (quando na verdade temos um FPS igual a 10 ou mais, o que é bom para o VLC).
Exemplo: se você possui uma pasta com 12 imagens e deseja gerar um vídeo com 1 FPS (reproduzível no VLC), é necessário duplicar cada imagem várias vezes (digamos 10 vezes) e informar ao FFMPEG para gerar um vídeo de 10 FPS. Dessa forma, obteremos um vídeo com um total de quadros de 120, onde cada imagem será reproduzida por 1 segundo (duplicada 10 vezes), o que é simplesmente falso para 1 FPS.
Prefiro usar o
fps
parâmetro do que-r
(o que é mostrado em outra resposta) que pode, em alguns casos, ser problemático (de acordo com a documentação oficial ).Como a entrada
-framerate
é menor que a saídafps
, o FFMPEG duplicará os quadros para atingir a taxa de quadros de saída desejada (que é 10, de acordo com o comando acima).Também é importante notar que a ordem
-framerate
e-vf fps
é importante , pois essa configuração será aplicada ao próximo vídeo mencionado (entrada ou saída). Isso está de acordo com os documentos oficiais :fonte