Ao codificar o H.264 usando o ffmpeg, recebo o seguinte tipo de aviso em massa:
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
O que eles querem dizer? Não encontrei nada claro online ou na documentação do ffmpeg.
Respostas:
Eu estava recebendo milhares desses avisos com uma codificação específica. Eu estava diminuindo o tamanho do vídeo 1080p para 480p. Em um ponto de edição, onde havia algum vídeo desonesto devido a um defeito no disco a laser de origem, essas mensagens começaram a aparecer e apareceram, penso eu, para todos os quadros subsequentes. Eles continuaram, como este pequeno trecho:
A invocação ffmpeg original era a seguinte:
Seguindo as sugestões aqui, adicionei -framerate 60000/1001 à entrada. Isso não melhorou nada. Mantive -framerate e adicionei -r 60000/1001 à saída. Isso ainda não melhorou nada. Mantendo os dois, finalmente adicionei -async 1 -vsync 1. Isso resultou no recebimento de um único aviso, e é tudo. Essa invocação foi:
A única diferença que encontrei em um despejo detalhado do MediaInfo foi a remoção dessa linha encontrada na invocação original, mas não na segunda:
No entanto, verifiquei a sincronização A / V perto do início dos arquivos e perto do final, e não havia diferença discernível na sincronização entre os dois arquivos. Os tempos de execução também eram os mesmos, mas isso foi medido apenas no segundo mais próximo, no VLC. Então eu verifiquei a contagem de quadros usando ffmpeg da seguinte forma:
e procurando "frame = #" próximo ao final da saída.
Acontece que o vídeo de origem tinha 375226 quadros, a invocação original rendeu 375195 quadros e a segunda invocação rendeu 375200. Portanto, a segunda invocação, com muito menos mensagens de aviso, também caiu 5 menos quadros.
Os testes subsequentes mostraram que -framerate e -r eram desnecessários, e apenas o uso dos dois sinalizadores de sincronização era suficiente. Isso produziu resultados idênticos à segunda invocação acima, portanto, a terceira e mais simples descoberta que resolvi para resolver o problema é a seguinte:
E ainda outro arquivo posteriormente produziu um monte desses avisos, mesmo com os sinalizadores de sincronização, mas a adição dos sinalizadores de taxa "o corrigiu" (apenas dois em vez de milhares de avisos). Às vezes, a segunda invocação funciona quando a terceira não. Para meus propósitos imediatos, vou me contentar com a segunda invocação e espero que ela resolva a maioria desses problemas.
Isso foi tudo com o ffmpeg versão 4.0.
fonte
-async 1 -vsync 1
consertei para mim.Um dos mantenedores do projeto DVDStyler no SourceForge disse o seguinte :
fonte
Essa mensagem de aviso aparece ao tentar codificar uma fonte de alta taxa de quadros para uma saída de baixa taxa de quadros, o que significa que os quadros precisam ser descartados.
Eu tive esse erro porque queria converter uma série de imagens em um vídeo:
O problema parece ser que, se nenhuma taxa de quadros for fornecida para a entrada, será assumida uma taxa de quadros de 25 fps:
Isso também pode ser visto no número total de quadros codificados. Eu tinha 400 imagens, mas o comando acima codificou apenas 384:
As mensagens de erro desaparecem definindo a taxa de quadros de entrada, se a taxa de quadros de saída. A taxa de quadros de saída será automaticamente escolhida para ser a da entrada. Além disso, nas versões mais recentes do ffmpeg, você deve prestar atenção, porque ao usar imagens PNG com a
-i
opção ou melhor, com o formatoimage2
ou dev4l2
entrada, você deve usar, em-framerate
vez de-r
, consulte a documentação da-r
opção .Também é possível especificar a taxa de quadros de entrada e saída separadamente:
Nesse caso, apenas 161/400 quadros serão codificados. Os outros quadros provisórios serão eliminados. Além disso, a mensagem de erro desaparece, acho que, para não desacelerar o ffmpeg enviando spam para o stdout, consulte:
fonte
-r
trabalhou onde-framerate
não.ffmpeg -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
a este com não mais avisoffmpeg -framerate 50 -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
(note o-framerate 50
agregado para entrada)Observando o código fonte , parece que a diferença entre o tempo de apresentação (pontos) no fluxo de entrada difere do tempo no fluxo de saída em mais de um limite fixo definido como 0,6.
Trechos da fonte:
...
Esta é apenas uma rápida olhada, então fique à vontade para aprofundar.
fonte
format_video_sync = VSYNC_DROP
ouformat_video_sync = VSYNC_PASSTHROUGH
ver se uma delas é viável no seu caso de uso.-r
interruptor "corrigido" esses avisos.De acordo com a edição nº 4700 do FFmpeg - duração anterior 0,999992 muito grande , é apenas um aviso. Usar:
Para parar isso.
Ned
fonte
O comando deve realmente ser:
Não há prefixo "-" para o parâmetro "quiet", pois não é uma opção, e sim um valor para a opção "-loglevel".
fonte