H.264 добавление темного сглаживания даже на high444 yuv444p

У меня есть файл PNG с белым на красном и без сглаживания вообще - каждый пиксель либо белый, либо красный, но когда я кодирую его в MP4, используя ffmpeg -i test.png -profile:v high444 -pix_fmt yuv444p -loop 1 -crf 0 -framerate 30 -c:v libx264 -t 15 test444.mp4вывод, добавляются темные пиксели, а белый цвет изменяется. Смотрите увеличенный снимок экрана ниже, чтобы увидеть до и после. Я воспроизвел файл mp4 с помощью ffplaybtw.

введите описание изображения здесь

Оригинальный PNG ниже:

введите описание изображения здесь

Можете ли вы поделиться оригинальным PNG?
@Mulvya добавил оригинальный PNG - спасибо
Похоже, это проблема скейлера, а не энкодера. Я посмотрю на это.
@Mulvya, есть ли способ отключить или изменить скейлер, чтобы посмотреть, решит ли это проблему? Я попытался использовать bitexact в свете вашего комментария, но это не помогло. Спасибо
Как вы просматривали и делали скриншот вывода?
@Mulvya Просмотрено с помощью ffplay test444.mp4и скриншота, сделанного с помощью Greenshot (обратите внимание, что скриншот файла PNG не имеет проблем - только полученный файл MP4). Спасибо

Ответы (1)

Это артефакт рендеринга, а не фактическая ошибка.

Видеть

ffplay test444.mp4 -vf scale=iw*16:-1:flags=neighbor

и

ffmpeg -i test444.mp4 roundtrip.png

Вы не должны видеть черных пикселей.

Обновление : ffplay понижает разрешение ввода YUV до 420 перед окончательным преобразованием в RGB.

[swscaler @ 0000000005a82800] bicubic scaler, from yuv444p to yuv420p using MMXEXT

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

ffplay test444.mp4 -vf format=bgra
Как странно - интересно, почему игрок решил добавить эти темные пиксели.
Я думаю, что декодер/дисплей использует yuv420
Верно. См. обходной путь.