O ffmpeg / avconv força a saída em escala a ser divisível por 2

10

Gravo minha área de trabalho com avconv (também conhecido como ffmpeg) e depois a dimensiono para 720p.

Eu adicionei recentemente ao meu script para que eles possam selecionar uma janela com o xwininfo e ela gravará essa janela especificamente.

No entanto, se o formato de saída não é divisível por 2, o codificador fica assustado e eu não entendo meu vídeo.

Existe uma maneira de corrigir isso dentro do ffmpeg, para que eu não precise fazer um monte de matemática manual no bash para definir os valores da escala?

É possível fazer com que o filtro de escala subtraia / adicione um à largura / altura, se estiverem desiguais? (volta?)

É possível aplicar outro filtro após a escala original que poderia fazer isso? (Isso arredondaria vídeos com tamanho de entrada desigual e sem redimensionamento)

#!/bin/bash
avconv \
-f x11grab -r $fps -s $capturesize -i :0.0$offset \
-vcodec libx264 \
-vf scale=-1:720 \
-pre:v lossless_ultrafast \
-threads 4 \
-y $@

Algumas listas de discussão antigas sugerem uma round()função que você pode usar no filtro, mas não consigo obter a sintaxe correta. Se funcionar, um scale=round(iw,2):round(ih,2)filtro aplicado no final resolveria todos os meus problemas de uma só vez. iwe ihnão parece funcionar.

JV
fonte

Respostas:

9

Como a divisão por 2 incorre em números ímpares às vezes, deve ser:

-vf scale="trunc(oh*a/2)*2:720"

Isso executa o que se deseja com -1:720sintaxe (mantenha a proporção original)

Fernando Piancastelli
fonte
Eu uso ceil, em vez truncde obter um número par mais alto como o caso de 16: 9 480p
Felipe Alcacibar
8

Na verdade, o filtro pode lidar com isso diretamente. Você só precisa passar ao -2invés do -1filtro: por exemplo

-vf scale="-2:720"

Fiquei surpreso ao descobrir isso em um relatório de bug de 3 anos atrás .

erik
fonte
Não funcionou para mim, qual é a versão mínima que suporta isso?
Letmaik 14/10
3
-2 funciona para mim em ffmpeg versão 2.3.3
Lance Nanek
7

Após muitas experiências, o filtro a seguir, aplicado após outros filtros de escala, arredondará a largura e a altura para 2.

scale=trunc(in_w/2)*2:trunc(in_h/2)*2

É basicamente uma coisa dividida, redonda e multiplicada, eu simplesmente não tinha a sintaxe certa.

JV
fonte