Когда я кодирую определенную последовательность файлов изображений BMP в AVC/H.264, цвета смещаются. Почему это происходит?
Но если я конвертирую BMP в PNG перед запуском ffmpeg, преобразование видео выглядит правильно. Мой исходный материал находится в формате BMP, и я бы предпочел не конвертировать все вручную в PNG, чтобы выполнить обходной путь.
Для этого вопроса я взял последовательность изображений и обобщил их по основным используемым цветам:
Первая попытка кодирования (чистый белый становится заметно зеленым):ffmpeg -i 000.bmp -pix_fmt yuv420p -vcodec libx264 -profile:v main -crf 16 first.mp4
Вторая попытка (еще хуже):ffmpeg -i 000.bmp -vf "colormatrix=bt601:bt709" -pix_fmt yuv420p -vcodec libx264 -profile:v main -crf 16 second.mp4
Третья попытка (слишком яркая):ffmpeg -i 000.bmp -vf "scale=in_range=full:in_color_matrix=bt709:out_range=full:out_color_matrix=bt709" -pix_fmt yuv420p -vcodec libx264 -profile:v main -crf 16 third.mp4
Однако использование версии того же входного изображения в формате PNG прекрасно работает:ffmpeg -i 000.png -pix_fmt yuv420p -vcodec libx264 -profile:v main -crf 16 fourth.mp4
Я использую последнюю сборку FFmpeg для Windows x86-64 (2016-11-22 Git d316b21):
C:\Temp> ffmpeg.exe -version
ffmpeg version N-82597-gd316b21 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 5.4.0 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2
--enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig
--enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray
--enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme
--enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame
--enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264
--enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger
--enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora
--enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis
--enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264
--enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma
--enable-decklink --enable-zlib
libavutil 55. 40.100 / 55. 40.100
libavcodec 57. 66.106 / 57. 66.106
libavformat 57. 58.100 / 57. 58.100
libavdevice 57. 2.100 / 57. 2.100
libavfilter 6. 67.100 / 6. 67.100
libswscale 4. 3.101 / 4. 3.101
libswresample 2. 4.100 / 2. 4.100
libpostproc 54. 2.100 / 54. 2.100
Перефразируя мой вопрос, как я могу преобразовать последовательность изображений BMP в видео H.264 без нежелательных сдвигов цвета?
По-видимому, FFmpeg неправильно устанавливает атрибуты входного цвета для ввода BMP (вероятно, потому, что файл не содержит этих метаданных), а декодер BMP не проверяет атрибуты, помеченные вручную. Однако мы можем заставить его использовать фильтр формата.
ffmpeg -i 000.bmp -vf format=rgb24 -pix_fmt yuv420p -vcodec libx264 -profile:v main -crf 16 first.mp4
RawBean
Гьян
Гьян
Наюки
Наюки
-vcodec libx264rgb -profile:v high444
(минус -pix_fmt), я получаю видео с идеальными цветами с нулевым отклонением. Однако в нее можно играть только в MPC-HC, а не в проводнике Windows или Mozilla Firefox. Я думаю, что было бы хорошо остаться в основном профиле H.264.эталь-когомологии
libx264rgb
исправилlibx264
проблему для меня. Большое спасибо!!