You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改FFmpeg blend滤镜命令使无差异区域显示为中灰色而非绿色

如何修改FFmpeg blend滤镜命令使无差异区域显示为中灰色而非绿色

没问题,我来帮你搞定这个命令!你遇到的绿色无差异区域是因为FFmpeg默认在YUV色彩空间下计算差值,改成RGB空间后我们还需要做些调整,既能把无差异区域改成实用的中灰色,又能完整保留正负差异的显示空间。

先理清楚核心的修改逻辑:

  • 把两个输入视频都转成GBRP格式,在RGB空间内计算像素差值
  • 将差值结果做偏移,让无差异时的纯黑(0值)变成中灰色,这样暗于灰的区域对应负差异、亮于灰的区域对应正差异,不会出现负差异被直接裁剪成纯黑的问题

给你两个版本的命令,按需选择:

推荐:浮点格式版(保留完整动态范围,无裁剪风险)

这个版本用32位浮点RGB做计算,能完整保留所有正负差异的细节,最后转成10位YUV输出,适合对画质要求高的场景:

ffmpeg -i orig.mkv -i compressed.mkv -filter_complex "[0:v]format=gbrpf32le[orig];[1:v]format=gbrpf32le[comp];[orig][comp]blend=all_mode=difference,add=0.5,format=yuv420p10le" -c:v libx264 -crf 18 -c:a copy diff.mkv

简化:8位整数版(适合快速测试,极端场景有轻微裁剪)

如果不需要极致的动态范围,用8位整数格式也能满足需求,只有极端差异会被轻微裁剪:

ffmpeg -i orig.mkv -i compressed.mkv -filter_complex "[0:v]format=gbrp[orig];[1:v]format=gbrp[comp];[orig][comp]blend=all_mode=difference,add=128,format=yuv420p" -c:v libx264 -crf 18 -c:a copy diff.mkv

关键参数的作用解释

  • format=gbrpf32le/format=gbrp:把输入视频转换为GBRP格式,强制差值计算在RGB空间进行,彻底解决YUV带来的绿色无差异区域问题
  • blend=all_mode=difference:计算原始视频和压缩视频的像素差值,无差异时输出纯黑(0值)
  • add=0.5/add=128:给所有像素值做偏移——浮点格式下0+0.5=0.5(标准中灰),8位整数下0+128=128(对应中灰)
  • format=yuv420p10le/format=yuv420p:转换回主流YUV格式,让x264编码器能正常处理

调整后的命令会让无差异区域显示为中灰色,你能清晰看到压缩后画面变亮(亮于灰)或变暗(暗于灰)的区域,不会丢失任何差异信息。

备注:内容来源于stack exchange,提问作者kshetline

火山引擎 最新活动