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.

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)


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 .


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.