我尝试使用简单的叠加命令在黑色视频上放置 Logo ,但发现输出的颜色有点不同, Logo 绿色部分的原始 RGB 值是 (0,220,90),但更改为 (0,191 ,88) 的输出。看起来颜色与黑色背景混合在一起,有什么想法吗?
原始标志rgb:
视频上叠加 Logo 后的 RGB:
叠加命令:
ffmpeg -i video.mp4 -i logo.png -filter_complex "[1:v]format=rgba[s],[0:v][s]overlay=240:1275:format=auto" output.mp4
▶ ffmpeg -i logo.png
ffmpeg version 4.4-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 8 (Debian 8.3.0-6)
configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Input #0, png_pipe, from 'logo.png':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: png, rgba(pc), 601x81 [SAR 2834:2834 DAR 601:81], 25 fps, 25 tbr, 25 tbn, 25 tbc
▶ ffmpeg -i video.mp4
ffmpeg version 4.4-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 8 (Debian 8.3.0-6)
configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.76.100
Duration: 00:00:02.00, start: 0.000000, bitrate: 24 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1080x1920, 18 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
最佳答案
该问题与颜色格式有关。
FFmpeg默认的YUV颜色标准是BT.601 - FFmpeg 使用 BT.601 颜色转换公式从 RGB 转换为 YUV。
FFmpeg 使用 BT.601,但不将 H.264 流标记为 BT.601(FFmpeg 默认不设置视频流的颜色格式元数据)。
据我所知,视频播放器假设颜色标准为 BT.709 ,因为视频是高清的(超过720视频线),高清视频的推荐标准是BT.709(不同播放器可能不同)。
视频播放器使用 BT.709 颜色转换公式将 YUV 转换为 RGB,我们得到了颜色差异。
我建议您将视频转换为 BT.709,并将视频标记为 BT.709:
使用
scale
过滤器将视频转换为 BT.709:
scale=out_color_matrix=bt709:out_range=tv
使用 bsf 将视频标记为 BT.709“电视范围”(有限范围)过滤器:
-bsf:v h264_metadata=video_full_range_flag=0:colour_primaries=1:transfer_characteristics=1:matrix_coefficients=1
还建议指定 libx264 编码器,并设置 crf
和 pix_fmt
参数:
ffmpeg -y -i video.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=240:1275:format=rgb,scale=out_color_matrix=bt709:out_range=电视”-vcodec libx264 -crf 17 -pix_fmt yuv420p -bsf:v h264_metadata=video_full_range_flag=0:colour_primaries=1:transfer_characteristics=1:matrix_coefficients=1 输出.mp4
由于颜色转换舍入,仍然存在轻微的不准确性。
为了防止任何舍入错误,我们可以使用 libx264rgb 编码器,但视频可能不太便携。
我们可以使用 MediaInfo 检查颜色标准(元数据)工具:
Color range : Limited
Color primaries : BT.709
Transfer characteristics : BT.709
Matrix coefficients : BT.709
关于ffmpeg 在视频上叠加 png 有颜色问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75026733/