Utrzymanie proporcji z FFmpeg

Muszę przekonwertować kilka plików wideo za pomocą FFmpeg. Uruchamiam plik Bash, który ładnie konwertuje wszystkie pliki, jednak istnieje problem, jeśli przekonwertowany plik nie jest w formacie 16: 9.

Ponieważ ustawiam rozmiar ekranu na-s 720x400, jeśli proporcje oryginału wynoszą 4: 3, FFmpeg tworzy plik wyjściowy 16: 9, co powoduje przekręcanie proporcji.

Czy istnieje ustawienie, które umożliwia ustawienie proporcji jako głównego parametru, z dostosowaniem rozmiaru (dla przykład, ustalając tylko wymiar X lub Y)?

Author: one noa, 2011-11-21

8 answers

-vf "scale=640:-1"

Działa świetnie, dopóki nie napotkasz błędu

[libx264 @ 0x2f08120] height not divisible by 2 (640x853)

Więc najbardziej ogólnym podejściem jest użycie wyrażeń filtrujących:

scale=640:trunc(ow/a/2)*2

Pobiera szerokość wyjściową (ow), dzieli ją przez współczynnik proporcji (a), dzieli przez 2, obcina cyfry po przecinku i mnoży się przez 2. Gwarantuje to, że otrzymana wysokość jest podzielna przez 2.

Napisy do ffmpeg trac

UPDATE

Jak wskazywały komentarze prostszym sposobem byłoby użycie -vf "scale=640:-2". Kredyty dla @BradWerth dla eleganckiego rozwiązania

 74
Author: mente,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-29 09:46:18

Na przykład:

Format obrazu 1920x1080 16: 9 = > 640x480 4:3:

ffmpeg -y -i import.media -aspect 16:9 scale=640x360,pad=640:480:0:60:black output.media

Format Obrazu 16: 9 , rozmiar Szerokość 640pixel => wysokość 360pixel:
Z ostatecznym rozmiarem wyjściowym 640x480 i podkładką 60pixel czarny obraz (góra i dół):

"-vf scale=640x360,pad=640:480:0:60:black"
 30
Author: cool2ikou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-23 03:46:38

Pytałem o to dawno temu, ale w rzeczywistości mam rozwiązanie, które nie było mi znane w tym czasie -- aby zachować proporcje, powinieneś użyć skali filtra wideo, która jest bardzo mocnym filtrem.

Możesz go po prostu użyć w następujący sposób:

-vf "scale=640:-1" 

Który ustala szerokość i dostarcza wysokość wymaganą do zachowania proporcji. Ale możesz również użyć wielu innych opcji, a nawet funkcji matematycznych, sprawdź dokumentację tutaj - http://ffmpeg.org/ffmpeg.html#scale

 23
Author: 0-alpha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-16 21:13:38

Chociaż większość z tych odpowiedzi jest świetna, Szukałem polecenia, które może zmienić rozmiar do wymiaru docelowego (Szerokość lub Wysokość)przy zachowaniu proporcji. Udało mi się to osiągnąć za pomocą FFmpeg ' s Expression Evaluation.

Oto odpowiedni filtr wideo, o docelowym wymiarze 512:

-vf "thumbnail,scale='if(gt(iw,ih),512,trunc(oh*a/2)*2)':'if(gt(iw,ih),trunc(ow/a/2)*2,512)'"


Dla szerokości wyjścia:

'if(gt(iw,ih),512,trunc(oh*a/2)*2)'

Jeśli szerokość jest większa niż wysokość, zwróć cel, w przeciwnym razie zwróć proporcjonalna szerokość.


Dla wysokości wyjściowej:

'if(gt(iw,ih),trunc(ow/a/2)*2,512)'

Jeśli szerokość jest większa niż wysokość, zwróć proporcjonalną wysokość, w przeciwnym razie zwróć cel.

 14
Author: Charlie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-14 18:56:15

Użyj force_original_aspect_ratio, z FFmpeg trac :

ffmpeg -i input.mp4 -vf scale=720:400:force_original_aspect_ratio=decrease output.mp4
 12
Author: xmedeko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-29 15:32:17

Jeśli próbujesz dopasować obwiednię, dobrym punktem wyjścia jest użycie force_original_aspect_ratio zgodnie z odpowiedzią xmedeko .

To jednak nie działa, jeśli wejściowe wideo ma dziwny Rozmiar i kodujesz do formatu, który wymaga, aby wymiary były podzielne przez 2, co powoduje błąd.

W tym przypadku, można użyć oceny wyrażenia w funkcji scale, tak jak w Charlie ' s answer .

Zakładając wyjście obwiedniowe 720x400:

-vf "scale='trunc(min(1,min(720/iw,400/ih))*iw/2)*2':'trunc(min(1,min(720/iw,400/ih))*ih/2)*2'"

Rozbić to:

  • min(1,min(720/iw,400/ih) znajduje współczynnik skalowania pasujący do obwiedni (z tutaj), ograniczając go do maksimum 1, aby zapewnić, że będzie on tylko skalowany w dół, oraz
  • trunc(<scaling factor>*iw/2)*2 i trunc(<scaling factor>*iw/2)*2 Upewnij się, że wymiary są podzielne przez 2, dzieląc przez 2, dzięki czemu wynik jest liczbą całkowitą, a następnie mnożąc go z powrotem przez 2.

Eliminuje to konieczność znajdowania wymiarów wejściowego wideo przed kodowaniem.

 10
Author: tvStatic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-16 23:58:38

Możesz użyć ffmpeg-i, aby uzyskać wymiary oryginalnego pliku i użyć go w poleceniach do kodowania. Na jakiej platformie używasz ffmpeg?

 1
Author: box86rowh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-21 20:59:48

Jeśli' - aspect x:y ' jest obecny, a format pliku wyjściowego to ISO Media File Format (mp4), to FFmpeg dodaje pasp-atom (PixelAspectRatioBox) do stsd-box w ścieżce wideo, aby wskazać graczom oczekiwane proporcje obrazu. Gracze powinni odpowiednio skalować klatki wideo. Nie trzeba skalować wideo przed kodowaniem lub transkodowaniem, aby dopasować go do proporcji, powinien być wykonany przez odtwarzacz.

 1
Author: Shevach Riabtsev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-30 04:05:07