Muszę dopasować filmy do 640x360 (maksimum, jakie może obsłużyć odtwarzacz mojego telefonu), jednocześnie zachowując proporcje , ale chcę też, aby wideo pozostało niezmienione, jeśli jest mniejsze niż 640x360 (w końcu nie ma sensu przeskalowywać go).
Czy istnieje sposób na uzyskanie tego zachowania za pomocą wiersza polecenia ffmpeg?
min(…)
ale zdecydowanie łatwiejszy dzięki prostemu skryptowi, który analizuje wymiary. Zobacz moje polecenie tutaj, aby zobaczyć przykład tego, co można zrobić: superuser.com/questions/547296/…Odpowiedzi:
W nowszych wersjach ffmpeg możesz użyć opcji
scale
filtraforce_original_aspect_ratio
. Na przykład, aby zmieścić wideo w rozdzielczości 1280 × 720, bez skalowania (zobacz ten wpis, aby uzyskać więcej informacji):Tutaj
scale
filtr jest skalowany do 1280 × 720, jeśli wejściowe wideo jest większe. Jeśli jest mniejszy, nie będzie powiększany.pad
Filtr konieczny, aby wyjścia wideo do 1280 x 720, w razie jego proporcji lub wielkości różni się od wielkości docelowej jest.W starszych wersjach ffmpeg istnieje dość hackujące obejście. Najpierw określ szerokość, wysokość i proporcje wydruku. Pozwoli nam to zaoszczędzić trochę pisania.
Teraz zastosujmy polecenie super złożonego filtru, które napisał Jim Worrall :
Naprawdę nie będę wyjaśniać, co to wszystko robi, ale w zasadzie możesz go nakarmić dowolnym filmem, i to będzie tylko zmniejszanie, a nie zwiększanie. Jeśli masz na to ochotę, możesz podzielić filtr na poszczególne wyrażenia. Można to skrócić, ale tak też działa.
źródło
Bardziej czytelna wersja może wyglądać następująco:
640 / iw jest współczynnikiem skalowania w poziomie, a 360 / ih jest współczynnikiem skalowania w pionie
Chcesz zmieścić skalowany obraz w polu wyjściowym i zachować proporcje (przechowywania). Robisz to, wybierając najmniejszy współczynnik skalowania przy minimalnej funkcji: min (640 / iw, 360 / ih)
Chcesz uniknąć jakiegokolwiek skalowania (tj. Współczynnika skalowania> 1,0), więc dodajesz kolejną funkcję minimalną: min (1, min (640 / iw, 360 / ih))
Następnym krokiem jest obliczenie rozdzielczości wyjściowej przez pomnożenie współczynnika skalowania przez szerokość wejściową i wysokość wejściową:
szerokość wyjściowa = iw * min (1, min (640 / iw, 360 / ih))
wysokość wyjściowa = ih * min (1, min (640 / iw, 360 / ih))
Ostatnim krokiem jest zbudowanie polecenia filter. Nie ma potrzeby określania wysokości wyjściowej, możesz podać -1, a ffmpeg zachowa proporcje, stosując taki sam współczynnik skalowania jak dla szerokości.
źródło
Miałem też ten sam problem, ale rozwiązałem go, umieszczając wideo w kwadracie 640x640 (z powodu pionowych filmów zrobionych smartfonami).
Używając logiki immerzi i niektórych badań, kończę na tym:
ostatnia część dotyczy wysokości podzielnej przez 2, która jest potrzebna przez wiele koderów.
źródło