ffmpeg / avconv erzwingen, dass die skalierte Ausgabe durch 2 teilbar ist


10

Ich nehme meinen Desktop mit avconv (auch bekannt als ffmpeg) auf und skaliere ihn dann auf 720p.

Ich habe kürzlich zu meinem Skript hinzugefügt, damit sie ein Fenster mit xwininfo auswählen können, das dieses speziell aufzeichnet.

Wenn das Ausgabeformat jedoch nicht durch 2 teilbar ist, flippt der Encoder aus und ich bekomme mein Video nicht.

Gibt es eine Möglichkeit, dies in ffmpeg zu beheben, damit ich nicht ein paar manuelle Berechnungen in Bash durchführen muss, um die Skalierungswerte festzulegen?

Ist es möglich, dass der Skalierungsfilter eine Breite / Höhe subtrahiert / addiert, wenn sie ungleichmäßig sind? (runden?)

Ist es möglich, einen anderen Filter nach der ursprünglichen Skala anzuwenden, um dies zu erreichen? (Dies würde Videos runden, die eine ungleichmäßige Eingabegröße und keine Skalierung haben.)

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

Einige alte Mailinglisten schlagen eine round()Funktion vor, die Sie im Filter verwenden können, aber ich kann die Syntax anscheinend nicht richtig verstehen. Wenn es funktioniert, würde ein scale=round(iw,2):round(ih,2)am Ende angewendeter Filter alle meine Probleme auf einmal lösen. iwund ihscheinen nicht zu funktionieren.

Antworten:


9

Da die Division durch 2 manchmal in ungeraden Zahlen erfolgt, sollte es sein:

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

Dies führt das aus, was man mit der -1:720Syntax möchte (ursprüngliches Seitenverhältnis beibehalten)


Ich benutze ceilstattdessen trunc, um eine höhere
Paarzahl

8

Eigentlich kann der Filter direkt damit umgehen. Sie müssen nur passieren , -2anstatt -1an den Filter: zB

-vf scale="-2:720"

Ich war überrascht, dies in einem Fehlerbericht von vor 3 Jahren herauszufinden .


Hat bei mir nicht funktioniert, was ist die Mindestversion, die dies unterstützt?
Letmaik

3
-2 funktioniert für mich in ffmpeg Version 2.3.3
Lance Nanek

7

Nach vielen Experimenten sieht es so aus, als würde der folgende Filter, der angewendet wird, nachdem andere Skalierungsfilter die Breite und Höhe auf 2 gerundet haben.

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

Es ist im Grunde eine Sache der Teilung, Runde, Multiplikation, ich hatte einfach nicht die richtige Syntax.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.