ffmpeg / avconv force la sortie mise à l'échelle à être divisible par 2

10

J'enregistre mon bureau avec avconv (alias ffmpeg), puis je le redimensionne à 720p.

J'ai récemment ajouté à mon script pour qu'ils puissent sélectionner une fenêtre avec xwininfo et il enregistrera celle-ci spécifiquement.

Cependant, si le format de sortie n'est pas divisible par 2, l'encodeur panique et je ne reçois pas ma vidéo.

Existe-t-il un moyen de résoudre ce problème à l'intérieur de ffmpeg, donc je n'ai pas à faire de calculs manuels en bash pour définir les valeurs d'échelle?

Est-il possible d'avoir le filtre d'échelle soustraire / ajouter un à la largeur / hauteur s'ils sont inégaux? (rond?)

Est-il possible d'appliquer un autre filtre après l'échelle d'origine qui pourrait accomplir cela? (Cela arrondirait les vidéos qui ont une taille d'entrée inégale et sans mise à l'échelle)

#!/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 $@

Certaines anciennes listes de diffusion suggèrent une round()fonction que vous pouvez utiliser dans le filtre mais je n'arrive pas à obtenir la bonne syntaxe. Si cela fonctionne, un scale=round(iw,2):round(ih,2)filtre appliqué à la fin résoudrait tous mes problèmes à la fois. iwet ihne semblent pas fonctionner.

JV
la source

Réponses:

9

La division par 2 entraînant parfois des nombres impairs, elle devrait être:

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

Cela exécute ce que l'on voudrait avec la -1:720syntaxe (garder le rapport d'aspect d'origine)

Fernando Piancastelli
la source
J'utilise à la ceilplace truncpour obtenir un nombre de paires plus élevé comme dans le cas de 16: 9 480p
Felipe Alcacibar
8

En fait, le filtre peut le gérer directement. Il suffit de passer à la -2place du -1filtre: par exemple

-vf scale="-2:720"

J'ai été surpris de le découvrir dans un rapport de bogue d'il y a 3 ans .

erik
la source
Cela n'a pas fonctionné pour moi, quelle est la version minimale prenant en charge cela?
letmaik
3
-2 fonctionne pour moi dans ffmpeg version 2.3.3
Lance Nanek
7

Après beaucoup d'expériences, il semble que le filtre suivant appliqué après que d'autres filtres d'échelle arrondissent la largeur et la hauteur à 2.

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

C'est fondamentalement une chose divisée, ronde, multipliée, je n'avais tout simplement pas la bonne syntaxe.

JV
la source