O seguinte corrigirá a largura para um número divisível por 8 e então redimensionará a altura para um número divisível por 8, mantendo proporção correta:
ffmpeg -i <input> \
-c:a copy \
-c:v libx265 -preset medium -x265-params crf=28 \
-vf scale="trunc(iw/8)*8:-8" \
<output>
Como um bônus, se a largura já é divisível por 8, não haverá alteração na largura de saída e nenhum erro do FFmpeg.
Uma explicação para a sintaxe da escala, lembrando que a sintaxe é -vf scale=width:height
:
1. Cálculo da largura de saída:
-
iw/8
: A largura do fluxo de vídeo de entrada será dividida por 8. Portanto, uma largura original de 690 criaria um número 86,25 -
trunc
: o número 86.25 seria 'truncado' para 86 -
*8
: 86 seria multiplicado por 8 para dar uma largura final de 688 que, claro, é divisível por 8!
2. Cálculo da altura de saída:
-
-8
: FFmpeg calculará uma altura que é divisível por 8, mas que também mantém a proporção correta do arquivo original
Em um mundo perfeito, a codificação hevc é executada com unidades de codificação de 8x8, 16x16, 32x32 etc e essa sintaxe garante isso. Mais detalhes sobre este aqui ...
Referências: