O ffmpeg pode codificar vídeo de quadros de tamanhos diferentes?

3

Eu tenho um conjunto de ferramentas que produz quadros que normalmente são 1920x1080, mas ocasionalmente 1919x1080 ou 1920x1079. (Sim, isso é um bug. Por favor, continue lendo.) Quando o ffmpeg codifica um vídeo a partir dele, com um comando como

ffmpeg -y -r 30 -i foo/%04d.png -vcodec h264 out.mp4

em seguida, imprime observações como

Input stream #0:0 frame changed from size:1919x1080 fmt:rgb24 to size:1920x1080 fmt:rgb24

mas esses quadros, em vez de serem redimensionados e incluídos em out.mp4 , são omitidos de out.mp4 .

Esses quadros podem ser incluídos? Não encontrei nenhuma menção ao tamanho do quadro não-constante nos fóruns e na documentação, mas ffmpeg em si aqui afirma para redimensionar o quadro. (A observação é impressa na linha 1688 do ffmpeg.c. Lá, um sinalizador resample_changed é definido, o que faz com que os campos de largura e altura de InputStream *ist sejam corrigidos.)

David Elliman pode estar relatando comportamento semelhante em uma resposta a link .

    
por Camille Goudeseune 06.08.2013 / 20:50

4 respostas

2

Talvez o filtro de vídeo scale possa fornecer o que você está procurando:

ffmpeg -r 30 -i foo/%04d.png -vf "scale=1920:1080,format=yuv420p" -codec:v libx264 out.mp4

Isso forçará um tamanho de 1920x1080 para cada quadro. Isso pode resultar em uma imagem ligeiramente esticada ou esmagada se suas entradas de tamanho estranho forem simplesmente cortadas em vez de redimensionadas incorretamente. Se esse for o caso, considere o uso do filtro de vídeo pad , mas saiba que isso resultará em um barra colorida sólida para compensar os pixels ausentes.

scale também aceita várias funções se você quiser se divertir com isso. Consulte Redimensionando vídeos com o ffmpeg para caber no player de tamanho estático como exemplo.

Eu adicionei format=yuv420p porque, com uma entrada RGB para libx264, o ffmpeg tentará evitar a subamostragem de croma resultando no formato de pixel planar YUV 4: 4: 4 que a maioria dos jogadores não pode decodificar.

    
por 06.08.2013 / 22:29
1

Seja ou não um bug no FFmpeg ou algo do tipo FFmpeg deve documentar melhor o suporte ou a falta de suporte, eu realmente não vejo a questão da programação. Você deve consertar o bug que está gerando tamanhos de frame incorretos e agradecer que o FFmpeg tenha alertado você sobre este problema, já que silenciosamente "consertá-los" expandindo ou reamostrando pode ter provocado um pequeno "jitter" no vídeo codificado e deixado com defeitos sutilmente defeituosos. saída de vídeo e baixa qualidade de compressão.

    
por 06.08.2013 / 21:01
0

Você pode precisar especificar um modo de escala para o redimensionamento funcionar. Eu peguei isso da minha implementação.

--custom-anamorphic --display-width 1920  --keep-display-aspect --modulus 8 --crop 0:0:0:0
    
por 06.08.2013 / 21:34
0

Tente omitir o parâmetro -r 30 para a taxa de quadros de entrada e use -framerate 30 para a taxa de quadros de saída. Eu tive o mesmo problema e isso funcionou para mim.

    
por 02.07.2016 / 16:34