Często widziałem sameq
na przykład polecenia FFmpeg korzystające z tej opcji
ffmpeg -i input.mp4 -sameq output.avi
Co to znaczy? Czy to oznacza „tę samą jakość”? Jeśli nie, czego powinienem użyć?
źródło
Często widziałem sameq
na przykład polecenia FFmpeg korzystające z tej opcji
ffmpeg -i input.mp4 -sameq output.avi
Co to znaczy? Czy to oznacza „tę samą jakość”? Jeśli nie, czego powinienem użyć?
sameq
nie oznacza „tej samej jakości”Kilka zasobów w Internecie promuje korzystanie z opcji sameq
lub same_quant
, ale w gruncie rzeczy są one błędne. Użycie sameq
nie daje wyników o takiej samej jakości jak na wejściu.
Nigdy go nie używaj.
Źródłem zamieszania była źle napisana dokumentacja, która sugerowała, że użycie tej opcji zapewni tę samą jakość. Na szczęście opcja została usunięta.
Oto, co powiedziała dokumentacja FFmpeg :
Zauważ, że NIE JEST TO TAKA JAKOŚĆ. Nie używaj tej opcji, chyba że wiesz, że jej potrzebujesz.
W rzeczywistości programiści FFmpeg zmienili nazwę z sameq
na, same_quant
aby się upewnić, a następnie usunęli sameq
/same_quant
całkowicie; co oznacza, że ta opcja nie istnieje w najnowszej wersji FFmpeg, ale ten artykuł jest nadal przydatny dla osób używających starszych wersji FFmpeg.
Teraz, gdy to wyjaśniliśmy, przejdźmy do kilku szczegółów technicznych.
Aby zrozumieć, dlaczego nie działa niezawodnie, musimy zrozumieć, co oznacza „jakość” dla wspólnego kodera wideo i co wpływa na jakość. Dlaczego jeden film wygląda lepiej niż drugi, gdy jest skompresowany z różnymi przepływnościami? Co powoduje utratę konwersji i dlaczego wideo jest mniejsze niż oryginał po zakodowaniu?
Podczas kodowania wideo dane wejściowe są konwertowane na inny wymiar, najpierw stosując transformację matematyczną do bloków pikseli. Ta transformacja, głównie dyskretna transformacja kosinusowa , tworzy macierz liczb, które opisują, powiedzmy, pole 8 x 8 pikseli w filmie.
Twoje piksele 8 × 8 i odpowiadająca im matryca początkowo wyglądałyby tak: 1
Ale to za dużo danych! Jeśli chcemy skompresować wideo, możemy pozbyć się liczb w prawym dolnym rogu. Nie wyjaśnię, dlaczego tak jest, ale powiedzmy, że liczby w lewym górnym rogu są ważniejsze przy opisywaniu takiego bloku. Cały pomysł transformacji polega na umieszczeniu ważnych rzeczy w lewym górnym rogu.
Aby usunąć liczby w prawym dolnym rogu, możemy zrobić je zerami. Jeśli coś jest „niczym” lub po prostu powtarza się jako 0
s, nie będziemy musieli tego przechowywać, dzięki czemu zaoszczędzimy miejsce. Matematycznie musimy skwantyzować tę pierwszą macierz, stosując inną macierz, „macierz kwantyzacji”.
Spowoduje to powstanie macierzy, która ma teraz znacznie mniej liczb i wiele zer:
W rezultacie pierwsza matryca o wysokiej jakości z dużą ilością liczb zamieniła się w matrycę, która nadal przypomina te same 8 x 8 pikseli, ale o mniejszej jakości, ponieważ ma mniej liczb do opisania tych pikseli. Jeśli porównasz blok wizualnie, są one podobne, ale już nie takie same.
Tutaj macierz kwantyzacji określa jakość . To jest ważne. Możemy użyć różnych matryc kwantyzacji dla różnych jakości. Niektóre macierze kwantyzacji pozostawiają oryginalną macierz prawie nienaruszoną, inne nie. Im więcej liczb usuniemy, tym gorsza będzie jakość, ale tym bardziej możemy skompresować wideo, ponieważ w zasadzie możemy tutaj „wyrzucić” zera.
sameq
?Załóżmy, że kodujesz wideo i chcesz ustawić określoną jakość. Jak już się dowiedzieliśmy, różne macierze kwantyzacji prowadzą do różnej jakości, więc kiedy mówimy naszemu koderowi, aby używał jakości x
, wybierze odpowiednią macierz kwantyzacji, y
aby uzyskać tę jakość, cokolwiek to jest. Rezultatem jest wideo, które zostało skompresowane przy użyciu y
matrycy. 2)
A oto interesująca część: sameq
oznacza „ten sam kwantyzator”. Nie „ta sama jakość”. Jeśli masz nieaktualną wersję FFmpeg, nadal możesz ją znaleźć w ffmpeg --help
:
ffmpeg --help 2>&1 | grep sameq
Tak więc, kiedy teraz weźmiesz przekonwertowane wideo i ponownie je zakodujesz, i zastosujesz tę sameq
opcję, FFmpeg po prostu wybierze te same macierze kwantyzacji, które zostały użyte dla wejściowego wideo.
Działa to nieco, gdy używasz dokładnie tego samego kodeka dla wejścia i wyjścia, np. Podczas konwersji wideo XviD na wideo XviD, ale nadal będziesz mieć gorszą jakość. 3 Jest tak, ponieważ kodowanie czegoś, co jest już zakodowane, wyrzuci jeszcze więcej informacji. W powyższym przykładzie utworzymy jeszcze więcej zer w naszej macierzy, a wynik będzie wyglądał gorzej.
W ogóle nie działa na różnych kodekach wideo. Załóżmy, że konwertujesz wideo zakodowane w XviD za pomocą x264. 4 W przypadku tych dwóch kodeków stosowane wewnętrznie macierze kwantyzacji są różne - nie mają takich samych współczynników. Ta opcja nawet nie ma sensu! Niestety FFmpeg nadal pozwala ci z niego korzystać.
Konkluzja: nie używaj tej opcji, chyba że wiesz dokładnie, co robisz. Jeśli chcesz zakodować wideo za pomocą innego kodeka, ale zachować jakość, musisz poeksperymentować i sam ustawić jakość. Sprawdź, czy wynik jest satysfakcjonujący, a jeśli nie, ustaw wyższą jakość. To tyle, ile możesz zrobić.
Na koniec, jeśli chcesz przeczytać o tym, jak zachować jakość podczas ponownego kodowania, sprawdź następujące posty:
1) Tak naprawdę matryca nie odpowiada obrazowi. To tylko przykład.
2) Właściwie w dzisiejszych czasach większość procesów kodowania nie używa tylko jednej matrycy. Po ustawieniu określonej przepływności koder będzie używał różnych matryc, aby uzyskać średnią przepływność na sekundę. Podobnie, ustawiając pewną jakość, nowoczesne kodery stosują różne matryce w zależności od treści. Jest tak, ponieważ niektóre treści są „łatwiejsze” do kompresji niż inne i wymagają mniejszej kwantyzacji, aby uzyskać ten sam współczynnik kompresji.
3) Przykład: ffmpeg -i input.avi -sameq -c:v libxvid output.avi
. Nie używaj tego. Proszę.
4) Przykład: ffmpeg -i input.avi -sameq -c:v libx264 output.mp4
. Nie używaj tego też. Jestem poważny.
-sameq
opcja została wycofana, a następnie usunięta z avconv