Ändern Sie mit ffmpeg die Größe von Videos mit unterschiedlichen Breiten auf ein Seitenverhältnis mit fester Höhe

17

Ich möchte viele Videodateien für die Website unseres Unternehmens in Flash-Videos konvertieren. Ich habe eine Anforderung, dass alle Videos im 360p-Format vorliegen müssen, damit ihre Größe Nx360 ist.

FFMpeg verwendet das Argument -s , um die Zielauflösung als B x H anzugeben . Ich kenne W idth nicht, da es vom Seitenverhältnis der Quelldatei abhängt. Wenn die Quelle 640 x 480 ist, ist das Ziel 480 x 360. Wenn die Quelle 848 x 480 ist, ist das Ziel 636 x 360.

Gibt es eine Möglichkeit, es mit einem Schalter von ffmpeg zu tun? Dass das Seitenverhältnis erhalten bleibt und ich nur die Höhe des Zielvideos angeben werde?

Ich könnte es leicht lösen, indem ich ein Programm mache, das ffprobe startet, um die Größe des Quellvideos zu ermitteln, das Seitenverhältnis zu berechnen und dann eine neue Breite zu berechnen.

Axarydax
quelle

Antworten:

15

Sie könnten versuchen, diesen Videofilter hinzuzufügen:

-vf "scale=-1:360" 

-1 In diesem Fall bedeutet "Variabel" / "Unbekannt". Daher ändert dieser Filter die Größe des Videos, um das Seitenverhältnis der Eingabe beizubehalten und 360 als Höhe beizubehalten.

Für mich hat dies das gleiche Ergebnis gebracht, das Sie suchen.

user65600
quelle
6

Es sind noch nicht genügend Punkte vorhanden, um eine vorhandene Antwort zu kommentieren. Dies folgt jedoch der Antwort von user65600 und wird fortgesetzt, wenn für bestimmte Codecs eine durch 2 teilbare Breite / Höhe erforderlich ist (z. B. libx264).

Wenn Sie -1 (Variable / Unbekannt) verwenden, kann eine ungerade Zahl zurückgegeben werden. Um eine gerade # zu gewährleisten, müssen Sie so etwas wie verwenden trunc(ow/a/2)*2, dass automatisch die nächste gerade # berechnet wird, während das Seitenverhältnis beibehalten wird.

-vf "scale=trunc(ow/a/2)*2:360"

Quelle: https://ffmpeg.org/trac/ffmpeg/ticket/309

Toland H
quelle
3

-vf "scale=trunc(ow/a/2)*2:360" funktioniert aufgrund eines "selbstreferenzierenden" Fehlers nicht.

Stattdessen funktioniert Folgendes:

-vf Maßstab = -1: 360, Maßstab = Trunk (iw / 2) * 2: 360

Selbstreferenzierung wird somit durch zwei aufeinanderfolgende Skalierungen vermieden und die Rundung erfolgt im zweiten Schritt. Süß, nicht wahr? :)

ddystill
quelle
Einfacher Filtergraph 'Maßstab = -1: 480; scale = trunc (iw / 2) * 2: 480 'hat nicht genau einen Ein- und Ausgang. Fehler beim Öffnen der Filter!
digitalPBK