Я кодирую последовательности изображений 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
?
Цветовое кодирование YUV с подвыборкой цветности 4:2:0 является единственным широко безопасным форматом пикселей для воспроизведения в Интернете, хотя для некоторых кодеков могут поддерживаться другие форматы пикселей.
FFmpeg автоматически выбирает формат пикселей для вывода, поскольку не все кодировщики поддерживают все форматы пикселей. Он выберет формат пикселей, который лучше всего сохраняет исходную разрядность, схему дискретизации цветности и схему кодирования цвета, из форматов, поддерживаемых кодировщиком. PNG имеют формат пикселей RGB, и еще два года назад ffmpeg не поддерживал кодирование форматов RGB для кодировщиков VPx, поэтому он выбирал формат YUV с полной цветностью (4:4:4). Поскольку RGB стал поддерживаться в FFmpeg для VPx, будет выбран вариант RGB, например gbrp
.
Автоматический выбор отменяется путем ручного указания -pix_fmt
.
Потоки YUV могут быть сжаты более эффективно, чем RGB.
Частота кадров