Jak najlepiej przekonwertować plik mp4
na webm
bez utraty jakości (przy użyciu vp8
lub vp9
) z ffmpeg?
Jeśli zrobię ffmpeg -i in.mp4 out.webm
, jakość jest bardzo zła. Mogę określić docelową szybkość transmisji bitów przez -b:v
i tryb stałej jakości przez crf
, tj.
ffmpeg -i in.mp4 -crf 10 -b:v 1M out.webm
Daje to lepszą jakość. Jednak w tym celu muszę sprawdzić bitrate wejściowego wideo (tutaj 1M).
Zauważyłem również, że jeśli określisz znacznie większą wartość docelowej szybkości transmisji bitów niż szybkość transmisji danych wejściowych (na przykład -b:v 100M
), ffmpeg wydaje się po prostu użyj w przybliżeniu szybkości transmisji z wejściowego wideo z vp9 lub nieco wyższej szybkości transmisji z vp8. Jednak to rozwiązanie nie wydaje się być zamierzonym sposobem, aby to zrobić.
Jak wybrałbyś wartość crf i dlaczego?
Czy istnieje parametr, który automatycznie wybiera szybkość transmisji plik wejściowy i odpowiednią wartość crf, aby uzyskać taką samą jakość jak plik wejściowy?
Komentarze
- Ustaw bitrate na 0. I poeksperymentuj z crf . Ale twoja metoda wysokiej przepływności też działa, ponieważ wartość działa jak pułap, a nie cel
- @Mulvya: Czy bitrate 0 oznacza, że nie ma limitu? Nie ' t znaleźć to na stronie podręcznika.
- Gdy bitrate nie jest ustawione na zero, CRF jest ograniczone przez tę wartość. Przy zera ' To nie jest. ' jest dziwactwem koderów VPn.
- Ok, ale jeśli całkowicie pominę parametr bitrate, jakość stanie się bardzo zła, nawet jeśli tego nie zrobiłem ' t podać górną granicę szybkości transmisji.
- Link dla 200k (patrz pierwsza opcja na). W przypadku WebM b: v 0 zobacz tę .
Odpowiedź
Odpowiedź
Użyj dwuprzebiegowego trybu stałej jakości: ¹
ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 1 -an -f webm /dev/null ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 2 output.webm
Wyjaśnienie:
Ustawienie szybkości transmisji wideo na zero przy jednoczesnym określeniu współczynnika CRF (współczynnika stałej szybkości) włącza tryb stałej jakości, który jest ukierunkowany na określony poziom jakości percepcyjnej. W przypadku VP9 CRF może wynosić od 0 (najlepsza jakość) do 63 (najmniejszy rozmiar pliku).
Ważne jest, aby ustawić szybkość transmisji wideo na zero. Jeśli nie określisz szybkości transmisji wideo, domyślnie zostanie ustawiona wartość niska, co spowoduje przejście do trybu Ograniczona jakość, w którym każda klatka ma maksymalną szybkość transmisji. Chociaż może to być przydatne przy przesyłaniu strumieniowym, znacznie obniża jakość, ponieważ klatki z dużą ilością ruchu nie będą miały przepustowości potrzebnej do dobrego wyglądu.
Inną przyczyną utraty jakości jest to, że webm
(VP9) woli kodować w dwóch przebiegach, aby uzyskać najlepsze wyniki. W pierwszym przebiegu gromadzone są statystyki dotyczące wideo, które są następnie wykorzystywane w drugim przebiegu do tworzenia mniejszego i wyższej jakości wideo.
Zapoznaj się z dokumentacją ffmpeg VP9 , jeśli chcesz dowiedzieć się więcej.
Słowo o transkodowaniu
Przy okazji, ogólnie rzecz biorąc, transkodowanie formatów (pobranie skompresowanego wideo i ponowne skompresowanie go za pomocą innym kodekiem) jest złym pomysłem, ponieważ nie tylko dodasz normalne błędy związane ze stratnym kodowaniem wideo, ale stracisz bity w nowym formacie, próbując zachować artefakty ze starego.
Jeśli oznacza dosłownie „bez utraty jakości”
Opcja -lossless 1
kodera VP9 ffmpeg włącza bezstratny tryb jakości, ale z potencjalnie ogromnym wzrostem rozmiaru pliku.
Wszystko, czego potrzebujesz, to:
ffmpeg -i input.mp4 -lossless 1 output.webm
Kiedy próbowałem -lossless 1
na niskiej jakości mp4
, wynikowy webm
był 100 × większy, co nie było do przyjęcia dla mnie. Jeśli jednak Twoje pliki mp4
są już bardzo wysokiej jakości, spodziewam się, że różnica w rozmiarze nie będzie tak duża.
Przypis 1: Jeśli „ponownie używasz Microsoft Windows zamiast UNIX, zmień /dev/null
na NUL
.
Komentarze
- Świetna odpowiedź, dziękuję
-
/dev/null
? Co to oznacza? Jaki byłby odpowiednik dla użytkowników systemu Windows? Czy nadpisujeszinput.mp4
w pierwszym przebiegu? Ta odpowiedź wymaga dokładniejszego wyjaśnienia, co dokładnie robi każdy komponent. Nie ' nie oferuje użytkownikom średnio zaawansowanym wielu wyjaśnień jak to działa. - Cześć Hatefriend: Moja odpowiedź zawiera już długą sekcję z wyjaśnieniami oraz link do dodatkowych informacji, więc ' wolę nie przedłużać tego. Czy widziałeś przypis dotyczący systemu Microsoft Windows, który odpowiada na Twoje konkretne pytanie? Ponadto, jak wspomniano powyżej, pierwszy przebieg compi les statystyki dotyczące pliku wejściowego.Nie ma potrzeby obawiać się, że może nadpisać dane wejściowe.
- Próbowałem przekonwertować plik .MTS na .webm za pomocą tych dwóch poleceń (Ubuntu 20.10, ffmpeg wersja 4.2.2). Ale mam błędy: " Nieprawidłowy układ kanału 5.1 (z boku) dla określonej rodziny mapowania -1. Błąd podczas inicjalizacji strumienia wyjściowego 0: 1 – Błąd podczas otwierania kodera dla strumienia wyjściowego nr 0: 1 – być może nieprawidłowe parametry, takie jak bit_rate, szybkość, szerokość lub wysokość "
- dzięki za odpowiedź. jeśli transkodowanie jest ogólnie złym pomysłem, co zamiast tego zalecamy, jeśli chcesz przekonwertować filmy MP4 na WebM, a filmy WebM na MP4?
Odpowiedź
W Linuksie używam optimizeVideo , czyli otoki wokół ffmpeg, która automatycznie wykrywa te ustawienia zgodnie z Zalecenia Google .
W rezultacie powstaje film, w przypadku którego różnicy w jakości nie można stwierdzić, ale zazwyczaj jest ona o rząd wielkości mniejsza.