Estou tentando codificar um vídeo .mp4 de um conjunto de quadros usando o FFMPEG usando o codec libx264.
Este é o comando que estou executando:
/usr/local/bin/ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4
Às vezes, recebo o seguinte erro:
[libx264 @ 0xa3b85a0] height not divisible by 2 (520x369)
Depois de pesquisar um pouco, parece que o problema tem algo a ver com o algoritmo de dimensionamento e pode ser corrigido adicionando um argumento -vf.
No entanto, no meu caso, não quero fazer nenhum dimensionamento. Idealmente, quero manter as dimensões exatamente iguais às molduras. Algum conselho? Existe algum tipo de proporção que o h264 impõe?
-vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"
, que nem sequer é uma das respostas. A resposta correta para a pergunta de todos os outros é a de LordNeckbeard."scale="
vez de,"pad="
se ele / ela não quer pixels de preenchimento colorido?Respostas:
A resposta para a pergunta original que não deseja dimensionar o vídeo é:
Comando:
Basicamente, .h264 precisa de dimensões uniformes, para que este filtro:
Você pode alterar a cor do preenchimento adicionando parâmetro de filtro
:color=white
. Veja a documentação do pad .fonte
-vf pad="width=iw:height=ih+1:x=0:y=0:color=white"
. A documentação do ffmpeg pad está aqui: ffmpeg.org/ffmpeg-filters.html#pad-1 .-vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"
.Apenas use
-2
Na documentação do filtro de balança :
Exemplos
Defina a largura como 1280 e a altura será calculada automaticamente para preservar a proporção, e a altura será divisível por 2:
O mesmo que acima, mas com uma altura declarada; deixando a largura a ser tratada pelo filtro:
"divisível por 2"
Conforme exigido por x264, o "divisível por 2 para largura e altura" é necessário para saídas subamostradas de croma YUV 4: 2: 0. 4: 2: 2 precisaria de "divisível por 2 para largura" e 4: 4: 4 não tem essas restrições. No entanto, a maioria dos players não baseados em FFmpeg pode decodificar adequadamente apenas 4: 2: 0; é por isso que você geralmente vê
ffmpeg
comandos com a-pix_fmt yuv420p
opção ao exibir vídeo H.264.Embargo
Infelizmente, você não pode usar
-2
largura e altura, mas se você já especificou uma dimensão, usar-2
é uma solução simples.fonte
-vf scale=-2:-2
não funciona? No meu caso, quero preservar o tamanho do arquivo original o máximo possível. O que funcionou para mim foi-vf scale=-2:ih
. Mas não funciona se ambos os lados estiverem desiguais.-2
depende do valor declarado da outra dimensão.Size values less than -1 are not acceptable.
mas a resposta de @Zbyszek funcionou perfeitamente.ffmpeg
. Você pode baixar uma compilação estática .Se você deseja definir alguma largura de saída e ter a mesma proporção que o original
e para não cair com esse problema, você pode usar
(Apenas para pessoas que pesquisam como fazer isso com dimensionamento)
fonte
scale="trunc(oh*a/2)*2:720"
O problema com as
scale
soluções aqui é que elas distorcem a imagem / vídeo de origem, que quase nunca é o que você deseja.Em vez disso, descobri que a melhor solução é adicionar um bloco de 1 pixel à dimensão ímpar. (Por padrão, o preenchimento é preto e difícil de notar.)
O problema com as outras
pad
soluções é que elas não generalizam sobre dimensões arbitrárias, porque sempre acolchoam.Esta solução adiciona apenas um bloco de 1 pixel à altura e / ou largura se forem ímpares:
Isso é ideal porque sempre faz a coisa certa, mesmo quando não é necessário preenchimento.
fonte
scale=iw+mod(iw,2):ih+mod(ih,2):flags=neighbor
. Isso só pode aumentar cada dimensão em 1, se necessário, e duplicará a última linha / coluna.Provavelmente, devido ao fato de o vídeo H264 geralmente ser convertido do espaço RGB para YUV como 4: 2: 0 antes de aplicar a compactação (embora a conversão de formato em si seja um algoritmo de compactação com perda, resultando em economia de 50% de espaço).
O YUV-420 começa com uma imagem RGB (vermelho verde azul) e a converte em YUV (basicamente um canal de intensidade e dois canais "matiz"). Os canais de Matiz são subamostrados criando uma amostra de matiz para cada quadrado 2X2 desse matiz.
Se você tiver um número ímpar de pixels RGB na horizontal ou na vertical, terá dados incompletos para a última coluna ou linha de pixels no espaço de matiz subamostrado do quadro YUV.
fonte
LordNeckbeard tem a resposta certa, muito rápido
Para android, não se esqueça de adicionar
fonte
--disable-asm
em seu script de construção x264 . Isso resulta em lentidão desnecessária e significativa (você pode verificar o log do ffmpeg e, se mostrarusing cpu capabilties: none!
, é ruim). Não sei por que eles adicionaram isso, mas não sou desenvolvedor de Android.Você também pode usar a
bitand
função em vez detrunc
:bitand (x, 65534)
fará o mesmo
trunc(x/2)*2
e é mais transparente na minha opinião.(Considere 65534 um número mágico aqui;))
Minha tarefa era dimensionar automaticamente muitos arquivos de vídeo para meia resolução .
scale=-2,ih/2
levar a imagens ligeiramente desfocadasrazão:
scale
escala as dimensões reais do quadrosolução:
explicação:
setsar=1
significa que as dimensões de saída agora são finais, nenhuma correção de proporção deve ser aplicadaAlguém pode achar isso útil.
fonte