Jak zachować kolor RGB tak bardzo, jak to możliwe, konwertując serię plików PNG do kontenera wideo za pomocą ffmpeg?

1

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 ffmpegmogę 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.

amn
źródło
Jak wygenerowano PNG? Jakieś szczególne właściwości kolorów?
Gyan
Wygenerowano za pomocą After Effects. Brak konkretnych właściwości kolorów, o których mogę myśleć, jeśli dobrze cię rozumiem - obrazy nie zawierają żadnego profilu kolorów i są tylko nieoznaczonymi obrazami RGB.
dniu
Miałem wcześniej komentarz o tym, że PNG nie są w stanie przechowywać profilu, co w rzeczywistości było niepoprawne, więc go usunąłem - jednak PNG zapisane przez Photoshopa nie mogą mieć osadzonych profili, chociaż technicznie plik może go przechowywać. Nie zaskoczyłoby mnie, gdyby AE była podobna. Podczas eksportu przekonwertowałbym na sRGB i sprawdziłbym, czy to działa.
Tetsujin,

Odpowiedzi:

0

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ę:

    ffmpeg -r 25 -i image%03d.png -c:v libvpx -crf 4 -b:v 0 output.webm
    

    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 . ffmpegma tylko bardzo podstawową obsługę apng, więc lepiej jest użyć innych narzędzi, np . apngasm:

    apngasm output.png image001.png 1 25
    

    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.

  • Należy również wspomnieć o kodeku libx264rgb - użycie go będzie poprawnym sposobem kodowania dokładnych kolorów RGB, gdy / jeśli przeglądarki będą go obsługiwały.
semyonfilippov
źródło