ffmpeg / avconv wymusza podzielne wyjście skalowane przez 2

10

Nagrywam pulpit za pomocą avconv (aka ffmpeg), a następnie skaluję go do 720p.

Niedawno dodałem do mojego skryptu, aby mogli wybrać okno za pomocą xwininfo i zapisze je konkretnie.

Jednak jeśli format wyjściowy nie jest podzielny przez 2, koder wariuje i nie otrzymuję mojego wideo.

Czy istnieje sposób, aby to naprawić wewnątrz ffmpeg, więc nie muszę wykonywać ręcznej matematyki w bash, aby ustawić wartości skali?

Czy jest możliwe, aby filtr skali odejmował / dodawał jeden do szerokości / wysokości, jeśli są nierówne? (okrągły?)

Czy można zastosować inny filtr po oryginalnej skali, który mógłby to osiągnąć? (Spowodowałoby to zaokrąglenie filmów o nierównym rozmiarze wejściowym i braku skalowania)

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

Niektóre stare listy mailingowe sugerują round()funkcję, której można użyć w filtrze, ale wydaje mi się, że nie mam poprawnej składni. Jeśli to działa, scale=round(iw,2):round(ih,2)zastosowany na końcu filtr rozwiązałby wszystkie moje problemy naraz. iwi ihwydaje się, że nie działa.

JV
źródło

Odpowiedzi:

9

Ponieważ dzielenie przez 2 powoduje czasami nieparzyste liczby, powinno to być:

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

Wykonuje to, czego byś chciał ze -1:720składnią (zachowaj oryginalny współczynnik kształtu)

Fernando Piancastelli
źródło
ceilZamiast tego używam, truncaby uzyskać wyższy numer pary, jak w przypadku 16: 9 480p
Felipe Alcacibar
8

W rzeczywistości filtr może obsłużyć go bezpośrednio. Musisz tylko przekazać -2zamiast -1do filtra: np

-vf scale="-2:720"

Byłem zaskoczony, gdy dowiedziałem się o tym w raporcie o błędach sprzed 3 lat .

erik
źródło
Nie działało dla mnie, jaka minimalna wersja to obsługuje?
letmaik
3
-2 działa dla mnie w wersji ffmpeg 2.3.3
Lance Nanek
7

Po wielu eksperymentach wygląda na to, że następujący filtr zastosowany po tym, jak inne filtry skalują, zaokrągli szerokość i wysokość do 2.

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

Zasadniczo jest to dzieląca, okrągła, mnożąca rzecz, po prostu nie miałem właściwej składni.

JV
źródło