Безопасно ли использовать опцию yuva420 pix_format с ffmpeg для кодирования веб-видео?

Я кодирую последовательности изображений png в форматы webm и mp4, используя ffmpeg. Моя цель — добиться восприятия видео без потерь с наименьшим размером файла, которого я могу достичь.

Создаваемые мной webm-видео отлично работали и воспроизводились во многих браузерах, пока я не переключился на более позднюю версию ffmpeg, которую я скомпилировал из исходного кода. (Сообщенная версия ffmpeg — N-91380-g46fb150, что бы это ни значило).

Выходные webm-видео по-прежнему нормально воспроизводятся в VLC, но такие браузеры, как Chromium и Opera, отображают их с совершенно испорченными цветами. Кажется, что синий цвет в видео в основном заменен на зеленый — все равно это выглядит очень странно.

Я проверил цветовой режим с помощью ffprobe на видео, созданных с использованием старой и новой версий ffmpeg:

Старые веб-видео ffmpeg, которые работали везде:
vp9 (Profile 1), yuv444p(tv)
Новые веб-видео ffmpeg, которые работают в VLC, но искажают цвета в браузерах:
vp9 (Profile 1), gbrp(pc, gbr/unknown/unknown, progressive)

Команда ffmpeg, которую я использовал, ничего не указывала pix_format, и я почти уверен, что это было что-то вроде этого в старой и новой версиях ffmpeg:
ffmpeg -framerate 30 -f image2 -i frames/%04d.png -i my_audio.flac -c:v libvpx-vp9 -b:v 0 -tile-columns 2 -crf 18 -c:a libopus -b:a 128k -r 30 -g 300 -y my_video.webm

Я где-то читал pix_formatи пробовал это (обратите внимание на вариант yuva420p):
ffmpeg -framerate 30 -f image2 -i frames/%04d.png -i my_audio.flac -c:v libvpx-vp9 -pix_fmt yuva420p -b:v 0 -tile-columns 2 -crf 18 -c:a libopus -b:a 128k -r 30 -g 300 -y my_video.webm

Я выбрал yuvaвместо этого yuvв надежде, что он включит альфа-канал, потому что мои входные изображения png имеют прозрачность. Похоже, это сработало... теперь видео нормально воспроизводится в браузерах, как и в старой версии ffmpeg. По сравнению со старым результатом ffmpeg по умолчанию pix_format, ffprobe показывает небольшую разницу. Сообщает:
vp9 (Profile 0), yuv420p(tv, progressive)иalpha_mode: 1

Интересно, что размер выходного файла webm yuva420pменьше, чем если бы я не указывал эту pix_formatопцию. Это yuva420pпримерно 2/3 размера выходного файла, который использует gbrpрежим по умолчанию и искажает цвета при воспроизведении в браузере.

Так что, похоже pix_fmt yuva420p, это путь. Но поскольку я действительно понятия не имею о цветовых пространствах / форматах пикселей, мой вопрос: какой цветовой режим / pix_formatвариант мне выбрать, учитывая, что мне нужны высококачественные веб-сайты, небольшой размер файла и совместимость со многими браузерами? Есть ли недостатки при использовании yuva420pвместо значения по умолчанию gbrpили другого pix_formatварианта?

И за бонусные баллы;) если yuva420pвсе в порядке, почему ffmpeg меняет pix_formatзначение по умолчанию с yuvна gbrp?

Ответы (1)

Цветовое кодирование YUV с подвыборкой цветности 4:2:0 является единственным широко безопасным форматом пикселей для воспроизведения в Интернете, хотя для некоторых кодеков могут поддерживаться другие форматы пикселей.

FFmpeg автоматически выбирает формат пикселей для вывода, поскольку не все кодировщики поддерживают все форматы пикселей. Он выберет формат пикселей, который лучше всего сохраняет исходную разрядность, схему дискретизации цветности и схему кодирования цвета, из форматов, поддерживаемых кодировщиком. PNG имеют формат пикселей RGB, и еще два года назад ffmpeg не поддерживал кодирование форматов RGB для кодировщиков VPx, поэтому он выбирал формат YUV с полной цветностью (4:4:4). Поскольку RGB стал поддерживаться в FFmpeg для VPx, будет выбран вариант RGB, например gbrp.

Автоматический выбор отменяется путем ручного указания -pix_fmt.

Потоки YUV могут быть сжаты более эффективно, чем RGB.

Спасибо, Гьян ... ваши комментарии имеют достаточно смысла, поэтому я принимаю этот ответ, хотя я нахожу выбор субдискретизации цветности ffmpeg по умолчанию для кодирования PNG в VP9 довольно бесполезным и запутанным.