LINUX.ORG.RU

Потеря цвета при перекодировании видео

 , ,


1

1

Пытаюсь сжать качественый мультик размером 17 Гб до размера около 4-6Гб с минимальными потерями. Исходник:

Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Использую ffmpeg и энкодеры libx264 и h264_omx, но независимо от использованных настроек полученая картинка заметно тусклее. Если со смазыванием и/или квадратами всё понятно, то изменение яркости или цветового баланса не понятно. Единственное предположение, которое я смог найти по поисковикам - неверное определение цветового диапазона (опции -x264-params intut-range=:range= ). Проверка всех 4-х возможных вариантов tv/pc дала одинаковую потерю цветов, так что у меня кончились предположения, что может быть виновато.

Решение: опция -x264opts colorprim=bt709:transfer=bt709:colormatrix=bt709 энкодеру. Хз почему, ведь в исходном файле было явно указано Color primaries: BT.709, но энкодер этого не определил. Если указать опцию то цвет передаётся правильно, а как бонус - заметно меньше квадратов при перекодировании.

★★★★★

Последнее исправление: kirill_rrr (всего исправлений: 1)
Ответ на: комментарий от kirill_rrr

Исходный кадр, Перекодировано -profile:v high -level 40 -qmax 20 с обрезкой -vf crop

Я сравнил твои скриншоты. Получается первому можно верить, а второй скриншот плееры и/или скриншотеры делают в 601, вместо 709. PC/TV уровни не причем, у них другие искажения. Если ты видишь разницу и в плеерах, значит нетеггированные HD они тоже играют в 601, вместо 709, чего быть не должно. Можно добавить опции -x264opts colormatrix при кодировании, но по хорошему надо разбираться почему плееры неправильно играют, там влияет еще рендер и видеодрайвера. Я приводил ссылку на тестовые сэмплы. Так что похоже врут у тебя и ffmpeg и плееры одинаково, а с видео всё в порядке, потому что в YUV нечему портится. Поэтому я и просил залить сами видеофайлы.

оказывается важный вопрос и автонастройке тут делать нечего

Это сложная тема. У многих вообще уровни в драйверах неправильно настроены по умолчанию (изображение засвечено), такое обычно на Windows и Nvidia. А еще я замечал, если открыть одновременно два видеоплеера, один из них или оба могут немного искажать цвета.

h264 yuv420 -> apng rgb24 -> h264 yuv422

Не рекомендую такое.

anonymous
()
Ответ на: комментарий от anonymous

Делай скрины в smplayer (mpv), он вроде корректно всё сохраняет.

anonymous
()
Ответ на: комментарий от anonymous

У многих вообще уровни в драйверах неправильно настроены по умолчанию (изображение засвечено), такое обычно на Windows и Nvidia. А еще я замечал, если открыть одновременно два видеоплеера, один из них или оба могут немного искажать цвета.

В плеерах я обычно настраиваю гамму. Штатно она слегка повышена, иногда править приходится вверх или вниз. Если речь об аппаратных плеерах (в т.ч. omxplayer на пишке), то гаммы там нет, съиграть можно только монитором. А всякие vlc и *mplayer'ы просто обожают автонастройку всяких видеофильтров. И здесь уже слишком много переменных чтобы делать скриншоты с плеера. Поэтому самым достоверным я считаю кадр, выдернутый через ffmpeg в формат без потерь. И сравнивать их на одном мониторе и одном и том же просмотрщике без всяких масок (типа смазывания в eog/eom). Тут я выбрал гимп.

Получается первому можно верить, а второй скриншот плееры и/или скриншотеры делают в 601, вместо 709. PC/TV уровни не причем, у них другие искажения. Если ты видишь разницу и в плеерах, значит нетеггированные HD они тоже играют в 601, вместо 709, чего быть не должно. Можно добавить опции -x264opts colormatrix при кодировании

Вот тут я просто не знаю что это. И меньше чем за час не разберусь, по толковому мануалу на русском.

Не рекомендую такое.

Да, грязный хак. Но придётся использовать если не разберусь с -x264opts colormatrix

kirill_rrr ★★★★★
() автор топика
Ответ на: комментарий от kirill_rrr

всякие vlc и *mplayer'ы просто обожают автонастройку всяких видеофильтров

По умолчанию там все отключено, кроме может быть деинтерлейсера, который лучше включать только при необходимости самому.

Поэтому самым достоверным я считаю кадр, выдернутый через ffmpeg в формат без потерь.

Как оказалось он не всегда корректно это делает и вообще не панацея. Самый достоверный способ, это который лично ты проверил технически на достоверность результатов на конретной системе на тестовом файле.

Тут я выбрал гимп

Я привожу скрины к разрешению экрана в png или bmp и во весь экран поочередно открываю в просмотрщике изображений viewnior.

У меня на старой встройке все шпарит в 601, я уже привык. А дискретка корректно играет в зависимости от разрешения видеофайла. Но как мне вернуть старые привычные искажения? Добавил в опции smplayer format=colormatrix=bt.601. Дело в том, что на ютубе часто делают апскейл SD>HD и о такой ерунде, как колориметрия не задумываются (даже официальные каналы), а у меня много скачано оттуда. Так что искажения на искажения дают в итоге норму как ни странно. Другой пример, релизеры на трекерах делают рипы с BD в AVI, без коррекции, в итоге рожи красно-розовые. В smplayer можно нажать 5 на цифровой клавиатуре (оттенок -4) и становится лучше (6 вернуть как было).

anonymous
()

Решение: опция -x264opts colorprim=bt709:transfer=bt709:colormatrix=bt709 энкодеру. Хз почему, ведь в исходном файле было явно указано Color primaries: BT.709, но энкодер этого не определил. Если указать опцию то цвет передаётся правильно, а как бонус - заметно меньше квадратов при перекодировании.

kirill_rrr ★★★★★
() автор топика
Ответ на: комментарий от kirill_rrr

Сейчас бы наслаждаться квадратами. Включи петлевой фильтр или я не знаю там, зачем ты вообще с квадратами кодировал?

anonymous
()
Ответ на: комментарий от anonymous

Наверное banding? 10 битный формат очень помогает с ним.

anonymous
()

битрейт для 1080p начиная с 50М будет минимум потери цвета, все что ниже будет потеря цвета

с твоим размером там 80% сжатие кадра, как ты собираешься цвет не терять

missxu
()
Ответ на: комментарий от kirill_rrr

Решение: опция -x264opts colorprim=bt709:transfer=bt709:colormatrix=bt709 энкодеру. Хз почему, ведь в исходном файле было явно указано Color primaries: BT.709, но энкодер этого не определил. Если указать опцию то цвет передаётся правильно, а как бонус - заметно меньше квадратов при перекодировании.

это называется самообман, или иллюзия

missxu
()
Ответ на: комментарий от anonymous

Каких квадратов?

Артефактов кодирования h264 разумеется. Перекод на перекод даёт мешанину, но в данном случае энкодер точно попал в старые квадраты и кадры получились почти идентичными.

kirill_rrr ★★★★★
() автор топика
Ответ на: комментарий от missxu

Тут половина обсуждения о том, что кто то где то неверно выбирает спецификацию по которой декодировать цвета. Так оно и было, только оказалось довольно сложно найти ту самую фолшебную опцию для моего случая.

kirill_rrr ★★★★★
() автор топика
Ответ на: комментарий от missxu

Где то через сутки я смогу выложить получившийся кадр - я уже зачистил место от временных файлов и начал полный проход с -preset veryslow. Поищите там отличия.

kirill_rrr ★★★★★
() автор топика
Ответ на: комментарий от kirill_rrr

Перекод на перекод даёт мешанину, но в данном случае энкодер точно попал в старые квадраты и кадры получились почти идентичными.

Речь о макроблоках? В смысле? Если не менять разрешение и не менять размер макроблоков, то в любом случае будут совпадать. Или речь о чем-то другом?

anonymous
()
Ответ на: комментарий от kirill_rrr

Эта опция просто добавляет метаинформацию (теги/флаги) в h264 поток, предназначенную для декодера/плеера. Само видео никак не меняется, эти данные можно даже поменять без пересжатия http://forum.doom9.org/showthread.php?t=152419 Ну да основываясь на этой информации плеер/скриншотер может по другому выполнять YUV>RGB преобразование (при просмотре, создании скринов) и поэтому при просмотре могут быть другие цвета. Но вообще-то все 1080p по стандарту с флагами или без должны играться одинаково.

цвет передаётся правильно

При сжатии h264>h264 видео не покидает yuv пространства и цвет может поменяться только если насильно впихнуть фильтр -vf colormatrix=bt709:bt601 чего ffmpeg не делает без спроса даже тогда когда это надо делать (при конверсии HD<>SD)

энкодер этого не определил

Энкодер мог бы, конечно, и прописать в теги, но я заметил, что ffmpeg предпочитает не заниматься самодеятельностью.

anonymous
()
Ответ на: комментарий от kirill_rrr

Квадраты это удел ASP кодеков (XviD, DivX), а также MPEG1 и 2, разве x264 квадратит с включенным деблокингом при кодировании и декодировании? Насколько я знаю при недостатке битрейта он мылит.

anonymous
()
Ответ на: комментарий от anonymous

Даже если в мануале так и написано, я уверен это не правда. У меня было 2 тестовых фрагмента, один q20 второй color701. Второй отличается от q20 только добавлением вот этой опции, оба кодировались с 0 до 750 секунды, у обоих стандартный пресет. аудиопотоки обоих перекодированы libmp3lame -aq 1. Размер q20 был 900-960М, размер color701 чуть больше гига.

kirill_rrr ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Он мылит при деблокинге. Без деблокинга он делает квадраты. Если разрешение огромное, то квадраты выглядят лучше мыла.

kirill_rrr ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Вот пример Не знаю как правильно называется. Некоторые квадраты отличаются по размеру и сдвинуты от общей сетки. Это из оригинального кадра, масштаб 800%.

kirill_rrr ★★★★★
() автор топика
Ответ на: комментарий от anonymous

З.Ы. Да собственно библиотека x264 если и умеет деблокинг, то хорошо это скрывает. Единственное где я встречал деблокинг h264 в действии, это аппаратный энкодер h264_omx на raspberry pi.

kirill_rrr ★★★★★
() автор топика
Ответ на: комментарий от kirill_rrr

Я сейчас закодировал 2 тестовых фрагмента с опцией и без. Разницы в размере нет. Я имею в виду софтовый libx264.

anonymous
()
Ответ на: комментарий от anonymous

Значит поставлю ещё один проход в очередь для теста.

kirill_rrr ★★★★★
() автор топика
Последнее исправление: kirill_rrr (всего исправлений: 1)
Ответ на: комментарий от anonymous

У меня тоже не оказалось разницы.

kirill_rrr ★★★★★
() автор топика
Ответ на: комментарий от anonymous

bt470bg это для SD PAL 25 fps, если что. Для NTSC 23.976/24/29.97 используется smpte170m. Хотя это тоже самое по сути (и соответствует BT.601), просто так повелось.

При даунскейле HD>SD не забывайте также добавить фильтр -vf colormatrix=bt709:bt601,scale=720:576 При апскейле SD>HD -vf colormatrix=bt601:bt709,scale=1280:720

anonymous
()
Ответ на: комментарий от anonymous

Кстати Kdenlive цвета учитывает (как и коммерческие монтажки). А Cinelerra и Blender о них знать не знают (если положить на таймлайн SD и HD).

anonymous
()
Ответ на: комментарий от kirill_rrr

Сначала я тоже юзал функцию телека для просмотра. Потом понял что это говно и заменил вьювер на приставку IPTV, которую с повсеместным распространением h265 буду менять на маленький ПК с пассивным охлаждением.

peregrine ★★★★★
()
Ответ на: комментарий от anonymous

о них знать не знают

Я так думаю все полагаются на дефолты ffmpeg'а (при преобразованиях RGB уровни он корректирует, а цвета только в редких случаях), но разработчики Kdenlive оказались немного более профессиональны в этом вопросе.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.