Jak zmienić rozmiar ramki, zachowując szerokość (używając ffmpeg)?

21

Jestem nowy w tej witrynie StackExchange i korzystam z kodera FFmpeg. Mam film w rozdzielczości 720x480 (3: 2), który chciałbym zmienić na 720x406 (16: 9), aby pasował do innych filmów, które mam dla witryny. Próbowałem różnych kombinacji poleceń, w tym:

ffmpeg -i myfile.mv4 -s 720x406 outfile.mp4
ffmpeg -i myfile.m4v -c copy -aspect 16:9 outfile.mp4

Skończyłem z wideo, które zostało zmniejszone do określonej wysokości, ale nie zachowało szerokości. Kończy się na 608 x 406 lub więcej. Dzisiaj bawiłem się różnymi wersjami GUI FFmpeg i wydaje się, że robią to samo.

Jakie byłyby odpowiednie opcje / parametry do przekazania (zakładając, że będę mieć większą kontrolę za pośrednictwem wiersza poleceń), aby osiągnąć pożądany rozmiar ramki?

eljefejb
źródło

Odpowiedzi:

36

zrobi to za pomocą filtra skali, ale jest w tym trochę więcej.

ffmpeg -i input.mov -vf scale=720x406 output.mov 

utworzy film z wymaganymi wymiarami w pikselach, ale jeśli spojrzysz na wynik, zauważysz, że dodaje on informacje do metadanych, dzięki czemu będzie odtwarzany w takim samym współczynniku proporcji jak oryginał, przy użyciu pikseli innych niż kwadratowe. Jeśli więc chcesz rozciągnąć film anamorficznie do nowego współczynnika proporcji, musisz ręcznie ustawić współczynnik proporcji pikseli, zwany SAR dla „Sample Aspect Ratio”, dlatego w przypadku pikseli kwadratowych użyj:

ffmpeg -i input.mov -vf scale=720x406,setsar=1:1 output.mov

Alternatywnie możesz ustawić proporcje wyświetlania na cokolwiek chcesz, a zatem:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 output.mov

To, co robię z komendą -vf i x = y, z = następujące wyrażenia, tworzy łańcuch filtrów . Filtry mogą być dość złożone, ale w najprostszym użyciu przyjmują formę effect=parameter,nexteffect=anotherparameteri są przetwarzane w kolejności, w której je piszesz.

Możesz chcieć umieścić dodatkowe komendy dla kodeka i tak dalej, np. -c:v libx264Aby użyć kodera x264 mp4 i coś w rodzaju -crf 20ustawienia stałego współczynnika szybkości na 20 (zwykle całkiem niezły kompromis między rozmiarem a jakością). Racjonalnie kompletne polecenie wyglądałoby więc tak:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 -c:v libx264 -preset slow -profile:v main -crf 20 output.mov

Główny profil jest dobry dla kompatybilności urządzeń, slowustawienie wstępne dla kodera libx264 zapewnia całkiem dobrą równowagę między szybkością i jakością, więc jest to dobry ogólny koń roboczy kodujący sieć. Możesz go przyspieszyć za pomocą fastlub veryfastlub wolniej veryslowi placebosprawi, że będzie on jeszcze trochę lepszy niż veryslowkosztem znacznie dłuższego czasu przetwarzania (stąd nazwa).

BTW Nie używaj -c kopię , to znaczy po prostu skopiuj strumienie audio i wideo, nie robiąc nic dla nich w ogóle , więc nic nie robisz pod względem skali, kodek, bitrate itp będą miały żadnego wpływu.

dźgnięcie
źródło
1
Jeśli używasz najnowszych wersji ffmpeg, nie musisz już określać x264 jako kodeka, ale nadal warto sprawdzić, jakie ustawienia mogą być potrzebne.
stib
1
Myślę, że metadane mają tylko pole DAR. Więc używanie setsarto tylko pośrednie ustawianie DAR?
jiggunjer,
Muszę użyć opcji „-c copy”, ale z drugiej strony chcę zmienić rozmiar ekranu. Jak mogę to osiągnąć?
Dr.jacky
1
@ Mr.Hyde powinieneś zadać to jako nowe pytanie zamiast zadawać komentarz
stib