Próbuję przekonwertować moją bibliotekę wideo do formatu HEVC, aby zyskać miejsce. Uruchomiłem następujące polecenie dla wszystkich plików wideo w mojej bibliotece:
#!/bin/bash for i in *.mp4; do #Output new files by prepending "X265" to the names avconv -i "$i" -c:v libx265 -c:a copy X265_"$i" done
Teraz większość filmów konwertuje dobrze, a jakość jest taka sama jak wcześniej. Jednak kilka filmów o bardzo wysokiej jakości (np. Jeden wydruk filmu o rozmiarze 5 GB) traci jakość – cały film jest rozpikselowany.
Nie jestem pewien, co zrobić w tym przypadku. Czy muszę modyfikować parametr crf
w wierszu poleceń? Czy coś innego?
Chodzi o to, że wykonuję zbiorczą konwersję. Dlatego potrzebuję metody, w której avconv
automatycznie dostosowuje każdy parametr do dostosowania dla każdego filmu.
UPDATE-1
Okazało się, że crf
to pokrętło, które muszę wyregulować. Domyślny CRF to 28. Aby uzyskać lepszą jakość, mógłbym użyć mniej niż 28. Na przykład:
avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4
Jednak problem polega na tym, że w przypadku niektórych filmów CRF wartość 28 jest wystarczająco dobra, podczas gdy w przypadku niektórych filmów wymagany jest niższy współczynnik CRF. To jest coś, co muszę sprawdzić ręcznie, konwertując małe fragmenty dużych filmów. Ale w przypadku konwersji zbiorczej, jak ręcznie sprawdzić każdy film? Czy w jakiś sposób avconv
może inteligentnie dostosować CRF do wejściowego wideo?
UPDATE-2
Okazało się, że istnieje --lossless
opcja w x265: http://x265.readthedocs.org/en/default/lossless.html .
Jednak nie wiem, jak go poprawnie używać. Próbowałem użyć go w następujący sposób, ale dało to odwrotne wyniki (film był jeszcze bardziej pikselowany):
avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4
Komentarze
Odpowiedź
Z własnego doświadczenia wynika, że jeśli nie chcesz żadnej utraty jakości, –lossless to czego szukasz.
Nie jestem pewien co do avconv
, ale polecenie, które wpisałeś, wygląda identycznie jak to, co robię z FFmpeg
. W FFmpeg
możesz przekazać parametr w ten sposób:
ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv
Większość x265
(opcje bez wartości) mogą być określone w ten sposób (z wyjątkiem tych tylko dla CLI, są one używane tylko z x265
bezpośrednio binarnymi).
Chcąc się tym zająć, chciałbym podzielić się swoim doświadczeniem z kodowaniem x265
. W przypadku większości filmów (czy to WMV, MPEG czy AVC /H.264) Używam crf=23
. x265
decyduje o pozostałych parametrach i zwykle wykonuje wystarczająco dobrą robotę.
Jednak często zanim zdecyduję się na transkodowanie całego wideo, testuję swoje ustawienia, konwertując niewielką część danego wideo. Oto przykład: załóżmy, że plik mkv ze strumieniem 0 jest wideo, strumień 1 to dźwięk DTS, a strumień 2 to podtytuł:
ffmpeg -hide_banner \ -ss 0 \ -i "INPUT.mkv" \ -attach "COVER.jpg" \ -map_metadata 0 \ -map_chapters 0 \ -metadata title="TITLE" \ -map 0:0 -metadata:s:v:0 language=eng \ -map 0:1 -metadata:s:a:0 language=eng -metadata:s:a:0 title="Surround 5.1 (DTS)" \ -map 0:2 -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \ -metadata:s:t:0 filename="Cover.jpg" -metadata:s:t:0 mimetype="image/jpeg" \ -c:v libx265 -preset ultrafast -x265-params \ crf=22:qcomp=0.8:aq-mode=1:aq_strength=1.0:qg-size=16:psy-rd=0.7:psy-rdoq=5.0:rdoq-level=1:merange=44 \ -c:a copy \ -c:s copy \ -t 120 \ "OUTPUT.HEVC.DTS.Sample.mkv"
Zauważ, że linia sygnału z ukośnikiem odwrotnym przerywa w długim poleceniu, robię to, aby pomóc mi śledzić różnych bitów złożonego wejścia CLI. Zanim wyjaśnię to wiersz po wierszu, część, w której konwertujesz tylko niewielką część wideo, to druga linia, a druga ostatnia linia: -ss 0
oznacza szukanie do 0 sekund wcześniej rozpoczyna dekodowanie danych wejściowych, a -t 120
oznacza zatrzymanie zapisywania danych wyjściowych po 120 sekundach. Możesz także użyć formatów czasu gg: mm: ss lub gg: mm: ss.sss.
Teraz wiersz po wierszu:
- uniemożliwia
FFmpeg
wyświetlanie informacji o kompilacji podczas uruchamiania. Po prostu nie chcę tego widzieć, kiedy przewijam w górę w konsoli; -
-ss 0
szuka 0 sekund przed rozpoczęciem dekodowania danych wejściowych. Zauważ, że jeśli ten parametr jest podawana za plikiem wejściowym i przed plikiem wyjściowym, staje się opcją wyjściową i informujeffmpeg
, aby zdekodować i zignorować dane wejściowe do x sekund, a następnie rozpocząć zapisywanie danych wyjściowych. Jako opcja wejściowa jest mniej dokładna (ponieważ wyszukiwanie nie jest dokładne w większości formatów kontenerów), ale prawie nie zajmuje czasu.Jako opcja wyjściowa jest bardzo dokładna, ale dekodowanie całego strumienia przed określonym czasem zajmuje dużo czasu, a do celów testowych nie chcesz tracić czasu; -
-i "INPUT.mkv"
: Określ plik wejściowy; -
-attach "COVER.jpg"
: Dołącz okładkę (obraz miniatury, plakat, cokolwiek) do wyjścia. okładka jest zwykle pokazywana w eksploratorach plików; -
-map_metadata 0
: skopiuj wszystkie metadane z wejścia 0, które w przykładzie jest tylko wejściem; -
-map_chapters 0
: skopiuj informacje o rozdziale (jeśli są obecne) z wejścia 0; -
-metadata title="TITLE"
: Ustaw tytuł wideo; -
-map 0:0 ...
: Mapuj strumień 0 wejścia 0, co oznacza, że chcemy, aby pierwszy strumień z wejścia był zapisywany na wyjściu . Ponieważ ten strumień jest strumieniem wideo, jest to pierwszy strumień wideo w wyjściu , stąd specyfikator strumienia:s:v:0
. Ustaw język tag na angielski; -
-map 0:1 ...
: Podobnie jak w linii 8, zamapuj drugi strumień (dźwięk DTS) i ustaw jego język oraz tytuł (dla łatwiejszej identyfikacji przy wyborze od graczy); -
-map 0:2 ...
: Podobny do linii 9, z tą różnicą, że ten strumień jest napisem; -
-metadata:s:t:0 ...
: Ustaw metadane dla okładki. Jest to wymagane w przypadku formatu kontenera mkv; -
-c:v libx265 ...
: opcje kodeka wideo. Jest tak długi, że podzieliłem go na dwie linie. To ustawienie jest dobre dla wysokiej jakości wideo bluray (1080p) z minimalnym pasmowaniem w gradiencie (które x265 jest do bani). Najprawdopodobniej jest to przesada w przypadku płyt DVD, programów telewizyjnych i filmów z telefonu. To ustawienie jest w większości skradzione z tego posta Doom9 ; -
crf=22:...
: kontynuacja kodeka wideo parametry. Zobacz wspomniany powyżej post na forum; -
-c:a copy
: Kopiuj na dźwięk; -
-c:s copy
: Kopiuj napisy; -
-t 120
: Zatrzymaj zapisywanie na wyjściu po 120 sekundach, co daje nam 2-minutowy klip do podglądu jakości trankodowania; -
"OUTPUT.HEVC.DTS.Sample.mkv"
: nazwa pliku wyjściowego. Oznaczam nazwy plików kodekiem wideo i głównym kodekiem audio.
Uff. To moja pierwsza odpowiedź, więc jeśli jest coś, co przegapiłem, zostaw komentarz. Nie jestem ekspertem od produkcji wideo, jestem tylko facetem, który jest zbyt leniwy, aby obejrzeć film, wkładając płytę do odtwarzacza.
PS. Może to pytanie należy do innego miejsca, ponieważ nie jest „t silnie związana z Uniksem & Linux.
Komentarze
- Dokładnie to, czego szukałem ! Niezłe pokrycie opcji. Czy wiesz, czy ffmpeg zaprzeczy na
c:s copy
, jeśli nie ma napisów? - @ElderGeek Nie, ffmpeg powie coś tylko wtedy, gdy ta opcja będzie miała jakikolwiek efekt.
- @TheBitByte Myślę, że tak i nie. Nie ' nie chcesz bezstratnych plików h265. To ' to zwykły strumień bitów bez żadnej kompresji. Jest ' jest ogromny. Z tego, co rozumiem o implementacji h265 lub konkretnie x265, nie jest to bezstratna metoda kompresji. Każdy stopień kompresji spowoduje utratę informacji, ale niekoniecznie utratę jakości oglądania. Ale ' nie jestem ekspertem od tematów h265, więc ' jest możliwe, że coś przeoczyłem
- @ TheBitByte Nie ' Nie sądzę, że w h265 jest bezstratny poziom kompresji. W przypadku opcji bez kompresji ' jest po prostu
--lossless
. Na próżno szukałem bezstratnej konwersji z h264 na h265, a to, czego ' dowiedziałem się, mówi mi, że ' jest matematycznie niemożliwe. - Naprawdę powinieneś edytować polecenie zawierające
--lossless
wyłącz tę odpowiedź, ponieważ umieść tam odpowiedź na to pytanie, brzmi to tak, jakbyś ' mówimy, że to ' bezstratna kompresja, która jest myląca.
Odpowiedź
Niedawno miałem problem z transkodowaniem całego mojego katalogu filmów do HEVC. Używam https://github.com/FallingSnow/h265ize z następującymi ustawieniami.
h265ize -v -m medium -q 20 -x –no-sao – -aq-mode 3 –delete –stats
-v – Pełne dane wyjściowe
-m medium – Medium prędkość kodowania (mniejsza, wyższa jakość, wszystko, co wolę, nie jest warte czasu / jakości dif)
-q 20 – użyty CRF, 20 jest podobny do 18 lub więcej w x264, ale hej.To dotyczy treści 1080p (90% mojego telewizora). Zwykle używam 22 do moich filmów 4K
-x – Użyj centralnie zdefiniowanych poleceń x265
–no-sao wyłącza Sample Adaptive Offset (poprawia szybkość kodowania)
–aq-mode 3 – użyj kwantyzacji adaptacyjnej z automatyczną wariancją, pomaga w 8-bitowym kodowaniu, szczególnie w ciemnych obszarach, zatrzymuje większość pasm, które mogą się zdarzyć (choć kosztem czasu kodowania)
–delete – zamień kodowanie na zakodowany plik (przetestuj przed użyciem tego)
–stats – Zapisz statystyki do pliku csv w katalogu głównym ścieżki, z której uciekłeś.
Szybkość kodowania wynosi około 30 klatek na sekundę (dla większości materiałów 1080p) na moim komputerze. Podwójny Xeon E5 2687W v2, ale zmuszam proces FFMPEG, aby nie używał pierwszej strony jednego z procesorów (to mój serwer Plex, więc muszę upewnić się, że istnieje narzut związany z transkodowaniem, jeśli jest to konieczne podczas odtwarzania itp.)
Tak, konwersja większości z nich zajęła trochę czasu, a teraz mam zaplanowane zadanie, które jest uruchamiane dwa razy dziennie, aby zakodować zawartość od tego dnia do x265.
Oszczędność miejsca były ogromne. Mój początkowy SAN miał 20 TB wykorzystania, teraz ma około 12, ale oczywiście został dodany także z 6-miesięcznym większą zawartością.
Zacząłem też transkodować wszystkie moje Filmy, jednak to jest proces ciągły, ponieważ muszę identyfikować poziomy jakości (na szczęście Radarr ładnie określa etykiety) i używam jednego z trzech ustawień transkodowania:
-m slower -q 18 -x --no-sao --aq-mode 3
dla transkodowania 720p
-m medium -q 20 -x --no-sao --aq-mode 3
dla 1080p
-m medium -q 22 -x --no-sao
dla 2160p
Mam nadzieję, że to pomoże niektórym ludziom. Jeśli ktoś potrzebuje ręcznie ustawiając to wszystko. Zanim zakodujesz wszystko do x265, pomyśl o odtwarzaniu, jeśli klient nie obsługuje natywnego x265, transkadowanie może być kosztowne pod względem procesora i jakości.
Komentarze
- W przypadku x265 2.4 i nowszych (z nowymi tabelami lambda , które dają ostrzejsze kodowanie), SAO jest zwykle dobra rzecz dla jakości na bitrate. Nadal nieznacznie się rozmazuje, ale zmniejsza ilość innych artefaktów na tyle, aby były tego warte.
-
-q 20
to nie CRF 20, to ' s stała kontrola tempa QP . Domyślny i zalecany tryb, CRF, podnosi QP w niektórych scenach o dużej złożoności, więc nie ' nie wydaje zbyt zbyt wielu bitów na sceny, które są zbyt trudne do kodować. (Jeśli chcesz zbliżyć się do jednolitego QP, podnieśqcomp
z domyślnego 0,6 do być może 0,7 lub 0,8. Bliżej 1,0 jest bliżej CQP.) - jak czy obsługujesz kodowanie hdr / sdr, gdy nie ' nie wiesz, jakie jest ich źródło?
Odpowiedź
Prawidłowa składnia włączenia trybu bezstratnego dla kodera x265 w ffmpeg to -x265-params lossless=1
(musisz dołączyć =1
).
Jednak do kodowania bezstratnego są lepsze opcje kodeków. Podczas testów stwierdziłem, że FFV1 kompresuje się znacznie lepiej (rozmiar pliku = ~ 80% x265) przynajmniej na niektórych rodzajach wideo (jeśli dla obu wybrano najlepsze ustawienia kodeki). Działa też szybciej, a (AFAIK) nie jest obciążony patentami. Oznacza to, że jest lepszy od bezstratnego H.265 pod każdym względem do archiwizacji wideo. Kompromisem jest jednak kompatybilność z aktualnym oprogramowaniem i sprzętem do odtwarzania.
--lossless
może faktycznie powiększyć plik, jeśli dekoduje poprzednio stratny kodek, a następnie dekoduje bezstratnie. Jakość pozostanie dokładnie taka sama jak na wejściu.