Jak mogę użyć, ffmpeg
aby zmniejszyć rozmiar filmu, obniżając jego jakość (naturalnie tak minimalnie, jak to możliwe, ale muszę go uruchomić na urządzeniu mobilnym, które nie ma dużo dostępnego miejsca)?
Zapomniałem jeszcze napisać jedną rzecz. Gdy wideo może używać napisów (* .srt lub * .sub), chciałbym je również przekonwertować, aby pasowały do parametrów przekonwertowanego pliku wideo.
video
ffmpeg
compression
xralf
źródło
źródło
ffmpeg
strona podręcznika pokazuje-fs
opcję ograniczenia rozmiaru wyjściowego, czy coś takiegoffmpeg -i in.avi -fs 100M out.avi
działa?man ffmpeg | wc -l --> 5254
.avi
nie jest główny problem ..avi
to tylko pojemnik. Głównym problemem jest to, jakich kodeków używasz. Wiele (większość?).avi
Filmów wykorzystuje kodeki starszego stylu (np. XviD), które są w porządku, ale są większe dla tej samej jakości w porównaniu z kodekami nowej generacji. Zazwyczaj można uzyskać ścisłe kodowanie przy użyciuH.264
standardu kompresji wideo (np. kodekax264
) iaac
kompresji dźwięku. Użyty kontener i kodeki zależy od Ciebie i Twojego telefonu ....mp4
Kontener jest dobrze przyjęty .. (ale Twój telefon może go obsłużyć: zobacz ten linkOdpowiedzi:
Zobacz tę odpowiedź. Cytowany poniżej dla wygody:
Zmieniaj kodek zgodnie z potrzebami - libx264 może być dostępny, jeśli nie ma libx265, kosztem nieco większego rozmiaru pliku wynikowego.
źródło
-crf 24
wziąłem wideo o wielkości 255,3 MB i zmniejszyłem je do 72,7 MB bez zauważalnego obniżenia jakości. Zyskaj głos!libx265
do jeszcze większego zmniejszenia rozmiaru.ffmpeg -i input.avi -vcodec libx264 -crf 24 output.avi
. Zmniejszyło wideo 100 MB do 9 MB. Bardzo niewielka zmiana jakości wideo. Dziękuję Ci!Jeśli nie szukasz określonej szybkości transmisji, polecam tę
-crf
opcję. Jest to najczęściej używane dox264
kodowania: http://slhck.info/articles/crfW skrócie: CRF wynoszący 23 sprawiłby, że film w jakości „DVD” (~ 700 MB-1 GB), a niższe wartości CRF byłyby wyższej jakości (większe pliki).
źródło
Wspomniałeś, że chcesz zmniejszyć rozmiar pliku, aby zmieścił się w nim więcej filmów na urządzeniu mobilnym, co również jest moją sprawą. Wszystkie odpowiedzi tutaj dotyczą obniżenia jakości kompresji, ale nikt nie wspomniał o zmniejszeniu rozmiaru klatki wideo. Jest o wiele szybszy, od około 3 do 5 razy szybszy niż ponowne kompresowanie z mojego doświadczenia. Aby uzyskać więcej informacji, zobacz dokumentację ffmpeg dotyczącą skalowania .
źródło
Testowałem większość innych proponowanych odpowiedzi na to pytanie. Wnioski z danych testowych są poniżej. Oto proponowane odpowiedzi, które przetestowałem:
(BR) Zmodyfikuj szybkość transmisji, używając:
(CR) Zmieniaj współczynnik stałej szybkości, używając:
(SZ) Zmień rozmiar ekranu wideo (na przykład na połowę jego rozmiaru w pikselach), używając:
(BL) Zmień profil H.264 na „podstawowy”, używając:
(DF) Użyj domyślnego przetwarzania ffmpeg, używając:
DANE
Obliczyłem docelową szybkość transmisji dla (BL) przy użyciu proponowanej metody.
=== Plik A - Jak węzeł pomaga napędzać Angular-Fnbixa7Ts6M.mkv ===
=== Plik B - Korzystanie z GraphQL z Angular _ By - Lee Costello-OGyFxqt5INw.mkv ===
WNIOSKI
Metoda (SZ) jest zdecydowanie najszybszą metodą. Było 2 do 4 razy szybsze. Może to stanowić poważny problem w przypadku filmów o wysokiej rozdzielczości, ponieważ konwersja wszystkich innych metod trwała dłużej niż rzeczywista długość filmu! Na przykład metoda (CR) zajęła 53 minuty, aby przekonwertować 21-minutowe wideo.
Metoda (SZ) jest zdecydowanie najlepszą metodą, jeśli definicja wideo jest większa niż definicja ekranu, na którym będzie wyświetlany. Na przykład, jeśli Twój telefon może wyświetlać tylko obraz 1080p, wysyłanie go do filmu o rozdzielczości 3840 x 2160 jest po prostu marnotrawstwem. Najlepiej byłoby zmniejszyć jego połowę do 1080p.
Niektóre z proponowanych odpowiedzi W rzeczywistości ZWIĘKSZYŁY rozmiar niektórych filmów. Na przykład metoda (BR) ponad dwukrotnie zwiększyła rozmiar próbki 1080p. Sprawił jednak, że rozmiar 2160p stanowił jedną trzecią. W przypadku próbki o wysokiej rozdzielczości wszystkie metody (CR), (BL) i (DF) ZWIĘKSZYŁY rozmiar filmu.
Prawidłowa (lub najlepsza) odpowiedź
Zawsze najlepiej jest najpierw obniżyć rozdzielczość do maksimum obsługiwanego przez docelowy ekran.
Jeśli chcesz jeszcze bardziej zmniejszyć rozmiar pliku, będzie to zależeć od osobistych wyborów. Możesz zmniejszyć zawartość informacji lub zwiększyć kompresję.
Możesz bardziej obniżyć rozdzielczość, jeśli nie dotyczy to ciebie.
Jeśli wideo nie zawiera scen szybkiej akcji, możesz zmniejszyć szybkość klatek.
Jeśli masz wydajny procesor, a jedynym problemem jest miejsce, możesz zwiększyć współczynnik kompresji.
Szybkość transmisji jest kombinacją wielu czynników. Więc samo powiedzenie ffmpeg, aby obniżyło szybkość transmisji, może nie dać oczekiwanych rezultatów.
Innym sposobem obniżenia zawartości informacji jest zmniejszenie głębi kolorów. Jak to zrobić, nie zostało jeszcze omówione.
źródło
Zauważ, że wydaje się, że
ffmpeg
już działa optymalizacja, gdy jest uruchamiany bez opcji, więc zanim spróbujesz użyć ustawień, których nie rozumiesz lub zdecydujesz się jawnie stracić informacje, wypróbuj domyślną konwersję:W moim przypadku zmniejszyło to przepływność zarówno wideo, jak i audio (możesz sprawdzić i porównać plik wejściowy i wyjściowy, uruchamiając
ffprobe
je), przekształcając 700 Mb wideo w 60 Mb jeden z pozornie podobnej jakości.źródło
Mam przepis, który pierwotnie opracowałem dla siebie w celu konwersji filmów Motion JPEG, które generuje mój stary aparat (są to bardzo duże filmy, ponieważ każda klatka to cały obraz JPEG) do h264. Oto adaptacja do innych rodzajów filmów (kursów itp.).
Nie używam ffmpeg , ale mplayer i mencoder . Najpierw musimy demuxować audio za pomocą mplayera:
-vo null
I-ao null
parametry Informuje MPlayera by nie wyodrębnić wideo.W następnych krokach wykonamy 3-etapową kompresję z mencoderem. Przy pierwszym przejściu wybierzemy odpowiednią kompresję w trybie stałej jakości ( parametr crf ) jako punkt początkowy:
Możesz dodać parametr slow_firstpass do -x264encopts, jeśli jesteś paranoikiem z ostateczną jakością wideo. Podręcznik Mencodera mówi, że ta opcja wyłącza niektóre parametry, które „znacznie poprawiają prędkość kodowania, a jednocześnie mają niewielki lub żaden wpływ na jakość końcowego przejścia”. Dlatego używaj go tylko na ostatnim etapie.
Powinieneś wypróbować kilka wartości dla CRF - spróbuj od 25 i dalej ją zwiększaj, aż zauważysz artefakty w wynikowym wideo (wyższe wartości kompresują więcej). Pamiętaj, że kolejne przejścia kodowania poprawią jakość, którą wybrałeś dla CRF .
Alternatywy dla veryslow presetu są wolniej , powolny , średnie itp Patrz podręcznik mencoder dla kompletnej listy.
ratetol kontroluje zmienność przepływności - nie jestem pewien, czy robię to dobrze, ale ustawiłem ją na maksymalną wartość, aby zapewnić całkowitą swobodę mencodera w wyborze właściwej przepływności dla każdej sceny.
Po pierwszym przejściu zauważysz, że ostatni wiersz podaje średnią szybkość transmisji bitów, której użyjesz w następnych krokach:
Zmień parametr crf , zalecany przy pierwszym przejściu, na bitrate , wymagany przy kolejnych przebiegach:
To kodowanie drugiego przejścia odczyta statystyki wygenerowane przy pierwszym przejściu (
divx2pass.log
idivx2pass.log.mbtree
) w celu zoptymalizowania kompresji.Pamiętaj, że użyjesz tego samego wejścia wideo, a nie generowanego przy pierwszym przejściu - wyjściowe wideo pierwszego przejścia jest przydatne tylko do sprawdzenia początkowej jakości.
Zauważ też, że
pass=3
( niepass=2
) wygeneruje nowy plik statystyk, więc możesz powtórzyć ostatni krok tyle razy, ile chcesz. Zwykle robię topass=3
dwa razy, zawsze zwracając uwagę na przepływność wyniku.W międzyczasie możesz również skompresować dźwięk, używając
lame
luboggenc
:Na koniec przemienimy audio i wideo
-of lavf -lavfopts format=mp4
Generujemp4
format pliku za pomocą lavopts mukserów.źródło
Skompresowałem 40-minutową prezentację wideo HD z 505 MB do 183 MB
To tak, jakby przejść ze 100 MB → 36 MB.
Oryginalne wideo było HD, a wyjściowa różnica była prawie zerowa.
To plik wideo „Chciałbym się zatrzymać, ale HD to przesada”.
Oto polecenie, którego użyłem z powodów:
ffmpeg -n -loglevel error -i inputfile.mp4 -vcodec libx264 -crf 28 -preset faster -tune film outputfilename.mp4
-n
: unikaj nadpisywania plików wyjściowych (bezpieczniejsze do testowania niż do grupowania)-loglevel error
: pokaż błędy i ukryj wiersze postępu-i inputfile.mp4
: nazwa pliku wejściowego-vcodec libx264
: przesunięto od górnej odpowiedzi powyżej-crf 28
: Kompresja jednoprzebiegowego z niewielkimi zauważalnej różnicy ( „0 = bezstratny, 23 = domyślne 51 najgorszym =; subiektywnie rozsądny zakres wynosi 17- 28 ” ) Dokumenty ref-preset faster
: wygląda 2x szybciej niż domyślny czas kodowania dokumentów referencyjnych „średnich”-tune film
: określ dane wejściowe to wideo HQ (inne opcje to „kreskówka”, „nieruchomy obraz” ..) dokumenty referencyjneoutputfilename.mp4
: Nazwa pliku wyjściowegoW przypadku katalogu plików wideo:
for i in *.{avi,flv,m4v,mov,wmv,mp4,MP4,TS,mkv}; do ffmpeg -n -loglevel error -i "$i" -vcodec libx264 -crf 28 -preset faster -tune film "cc${i}"; done
Zagadnienia:
.webm
pliki nie działają z poleceniem. Musiałem zamienić"cc${i}"
→"${i%.*}.mp4"
Hamulec ręczny to alternatywa typu open source z interfejsem użytkownika
źródło
Musisz użyć kodowania 2-przebiegowego, aby „dopasować” wideo do określonego rozmiaru pliku (bitrate), bez nadmiernego obniżania jakości. Jest to dość szczegółowy temat: http://web.archive.org/web/20171130050515/http://www.mpabo.com/2014/12/14/ffmpeg-and-x264-encoding-guide/
źródło
Napisałem skrypt bash do zmniejszania rozmiaru wideo i automatycznego wypróbowywania różnych wartości CRF.
Zasadniczo będziesz
Jest to bardzo przydatne, gdy masz limit rozmiaru, który chcesz osiągnąć i nie wiesz, jaka jest wartość crf, która pozwoli ci to zrobić.
Mam nadzieję, że to komuś pomoże. Dzieliłem się z kolegami i wszyscy uznali to za pomocne.
źródło