ffmpeg 在视频上叠加 png 有颜色问题

标签 ffmpeg

我尝试使用简单的叠加命令在黑色视频上放置 Logo ,但发现输出的颜色有点不同, Logo 绿色部分的原始 RGB 值是 (0,220,90),但更改为 (0,191 ,88) 的输出。看起来颜色与黑色背景混合在一起,有什么想法吗?

原始标志rgb:

enter image description here

视频上叠加 Logo 后的 RGB:

enter image description here

叠加命令:

ffmpeg -i video.mp4 -i logo.png -filter_complex "[1:v]format=rgba[s],[0:v][s]overlay=240:1275:format=auto" output.mp4

the logo and video :

▶ 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 编码器,并设置 crfpix_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 编码器,但视频可能不太便携。


logo.png:
enter image description here

output.mp4 使用 MPC-HC 媒体播放器播放:
enter image description here

output.mp4 使用 VLC 媒体播放器播放:
enter image description here


我们可以使用 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/

相关文章:

ffmpeg - 如何在 Windows 上将多个输入流式传输到多个输出?

video - FFMPEG:解释任何编解码器函数指针的参数

Ffmpeg 将视频拆分为多个 block ,但持续时间长度不同

c# 如何从 nvlc 捕获音频并引发 Accord.Audio.NewFrameEventArgs

video - 我可以从带时间戳的图像创建 VFR 视频吗?

c++ - 为什么 opencv videowriter 这么慢?

audio - FFmpeg 桌面录制不适用于蓝牙音频源

python ffmpeg : overlaying videos is dropping all audio

ffmpeg - 用于处理网络视频的 FFMPEG 性能设置

ubuntu - 错误 : libvpx decoder version must be >=0. 9.1