Mam 950 plików PNG, które mają stać się pojedynczymi klatkami na 38-sekundowej ścieżce wideo - 25 klatek na sekundę. Nazwy plików są identyczne, z wyjątkiem numeru sekwencyjnego, jak to zwykle jest w takich przypadkach.
Chcę stworzyć kontener o szeroko obsługiwanym formacie, najlepiej WebM, jeśli wszystkie kryteria mogą być z nim spełnione, lub na przykład MPEG-4, z kodekiem, który jest obsługiwany przez nowoczesne przeglądarki do odtwarzania, z tej serii obrazów PNG I mieć. Problem polega na tym, że kolory są przesunięte, a kolor tła w dekodowanym wideo nie jest już zgodny z tą samą trypletą RGB próbkowaną z koloru tła na obrazach PNG. Powoduje to, że wideo wystaje z zamierzonego tła na mojej stronie HTML, na której osadzone jest wideo.
Wypróbowałem prosty:
ffmpeg -f image2 -i image%03d.png output.webm
co faktycznie dało mi ścieżkę wideo VP9 25 fps zapakowaną w pojemnik WebM.
Obrazy PNG mają styl animacji, z jednolitym tłem i prostymi kształtami animującymi na pierwszym planie. Wyglądają na nieoznaczone kolorami (tak mówi mi Adobe Bridge, zakładam, że oznacza to brak osadzonego profilu kolorów lub odniesienie do jednego). Problem z moją powyższą próbą polega na tym, że pomimo tego, że kontener jest odtwarzany w Chrome, kolor tła próbkowany z obrazu PNG, z trypletem RGB #ED4D56
, nie percepcyjnie pasuje do koloru tła, który pojawia się w odtwarzanym filmie.
Czy jest to nieunikniony efekt uboczny konwersji kolorów z RGB na YUV (kodowanie) na RGB (odtwarzanie)? Czy jest jakiś sposób na złagodzenie tego? Nie nalegam, aby klatki w ścieżce wideo były kodowane za pomocą RGB, przypuszczam, że YUV jest w porządku, o ile nowoczesna przeglądarka odtwarzająca te klatki wytwarza ten sam (z niewielkim marginesem błędu) tryplet RGB podczas dekodowania i wyświetlania ramki.
Moje pytanie brzmi: za pomocą jakiego wiersza polecenia ffmpeg
mogę spróbować to złagodzić? Jestem otwarty, aby przełączyć kodek wideo, format pikseli, włączyć zarządzanie kolorami w ffmpeg, jeśli istnieje, itp.
Odpowiedzi:
Miałem ostatnio bardzo podobne zadanie i powiedziałbym, że wciąż nie ma idealnego rozwiązania (stan na październik 2018 r.). Jest to rzeczywiście efekt uboczny mało precyzyjnej konwersji kolorów z RGB na YUV na RGB. Nawet niektóre „bezstratne” warianty kodeków (np.
libvpx-vp9 -lossless
) Generują zniekształcone kolory z powodu przestrzeni kolorów YUV.Jeśli niedokładne kolory są dopuszczalne, kodek libvpx może zrobić całkiem niezłą robotę:
Przy tych ustawieniach spowodowało nieznaczne przesunięcie kolorów, a nawet dokładne kolory w niektórych zestawach ramek. Kodeki VPx są szeroko obsługiwane (wszystkie główne przeglądarki oprócz IE i Safari) i zapewniają rozsądny rozmiar pliku.
Jeśli dokładne kolory są ściśle wymagane, musimy unikać konwersji przestrzeni kolorów. Jedynym rozwiązaniem dla wielu przeglądarek, jakie wymyśliłem, jest użycie animowanych obrazów png .
ffmpeg
ma tylko bardzo podstawową obsługę apng, więc lepiej jest użyć innych narzędzi, np .apngasm
:będzie działać wszędzie oprócz IE i Edge'a (tam wróci do statycznej pierwszej klatki). Rozmiary plików są ogromne, ale taka jest cena prawdziwego bezstratnego kodowania.
źródło