有没有办法让过滤器读取帧元数据值?

有没有办法让过滤器读取帧元数据值?

我有一些用老式索尼数码相机拍摄的短视频,该相机具有“点曝光表”设置。启用此设置拍摄的视频(愚蠢的索尼工程师应该自动忽略视频!)当场景中心点色发生变化时,亮度会突然变化。
我已经使用 ffmpeg 成功地纠正了它们,使用eq=brightness=过滤器和一个与帧数相关的表达式。
首先,我使用此命令绘制了平均 Y 与帧数的图表:

ffmpeg -i input.mpg -vf signalstats,drawgraph=lavfi.signalstats.YAVG:min=0:max=255:slide=picture:size=1900x256,vflip,drawgrid=w=20:h=20:color=silver,drawgrid=w=100:h=100:color=red YAVG.bmp

这是视频的一部分的图表。请注意 Y 平均值的变化(0 位于顶部),而显示的场景完全没有变化,只有轻微的相机移动:

在此处输入图片描述

然后我制作了一个非常简单的 C# 应用程序来显示图形,捕获鼠标在曲线的选定点上的点击(这决定了一条调整到曲线的折线),并使用它们的 X、Y 值(对应于帧数,平均 Y)构建亮度校正表达式作为帧数 n 的函数。以下是一段约 1 分钟长的视频的(最令人印象深刻的)结果:

eq=brightness='if(lt(n,66),(n-0)*-0.00764/66+0.103,if(lt(n,81),(n-66)*-0.202/15+0.0955,if(lt(n,100),(n-81)*-0.0516/19+-0.106,if(lt(n,115),(n-100)*0.124/15+-0.158,if(lt(n,133),(n-115)*0.0716/18+-0.0334,if(lt(n,141),(n-133)*0.00382/8+0.0382,if(lt(n,152),(n-141)*-0.148/11+0.042,if(lt(n,176),(n-152)*0.00303/24+-0.106,if(lt(n,187),(n-176)*0.134/11+-0.103,if(lt(n,250),(n-187)*0.13/63+0.0305,if(lt(n,286),(n-250)*-0.141/36+0.16,if(lt(n,313),(n-286)*0.0878/27+0.0191,if(lt(n,374),(n-313)*-0.0649/61+0.107,if(lt(n,382),(n-374)*-0.0693/8+0.042,if(lt(n,406),(n-382)*0.0731/24+-0.0273,if(lt(n,427),(n-406)*-0.064/21+0.0458,if(lt(n,437),(n-427)*0.0411/10+-0.0182,if(lt(n,455),(n-437)*-0.135/18+0.0229,if(lt(n,470),(n-455)*0.0546/15+-0.112,if(lt(n,511),-0.0577,if(lt(n,520),(n-511)*-0.0243/9+-0.0577,if(lt(n,552),(n-520)*0.12/32+-0.0819,if(lt(n,600),(n-552)*0.0458/48+0.0382,if(lt(n,650),(n-600)*-0.0535/50+0.084,if(lt(n,689),(n-650)*0.00764/39+0.0305,if(lt(n,706),(n-689)*-0.12/17+0.0382,if(lt(n,714),(n-706)*0.00303/8+-0.0819,if(lt(n,731),(n-714)*0.0334/17+-0.0789,if(lt(n,814),(n-731)*-0.112/83+-0.0455,if(lt(n,879),(n-814)*0.234/65+-0.158,if(lt(n,900),(n-879)*-0.0344/21+0.0764,if(lt(n,914),(n-900)*-0.00382/14+0.042,if(lt(n,932),(n-914)*0.0458/18+0.0382,if(lt(n,1010),(n-932)*-0.0153/78+0.084,if(lt(n,1026),(n-1010)*-0.16/16+0.0687,if(lt(n,1043),(n-1026)*0.0546/17+-0.091,if(lt(n,1081),(n-1043)*0.00607/38+-0.0364,if(lt(n,1140),(n-1081)*-0.115/59+-0.0303,if(lt(n,1163),-0.146,if(lt(n,1184),(n-1163)*0.112/21+-0.146,if(lt(n,1206),(n-1184)*0.0525/22+-0.0334,if(lt(n,1221),(n-1206)*-0.00764/15+0.0191,if(lt(n,1231),(n-1221)*0.0649/10+0.0115,if(lt(n,1240),0.0764,if(lt(n,1262),(n-1240)*-0.101/22+0.0764,if(lt(n,1272),(n-1262)*-0.0971/10+-0.0243,if(lt(n,1295),(n-1272)*-0.0577/23+-0.121,if(lt(n,1344),(n-1295)*0.158/49+-0.179,if(lt(n,1386),(n-1344)*0.09/42+-0.0212,if(lt(n,1403),(n-1386)*0.00382/17+0.0687,if(lt(n,1451),(n-1403)*-0.194/48+0.0725,if(lt(n,1460),-0.121,if(lt(n,1502),(n-1460)*0.282/42+-0.121,if(lt(n,1527),(n-1502)*0.0573/25+0.16,if(lt(n,1554),(n-1527)*0.00382/27+0.218,if(lt(n,1575),(n-1554)*-0.0344/21+0.221,if(lt(n,1600),(n-1575)*-0.227/25+0.187,if(lt(n,1621),(n-1600)*-0.0577/21+-0.0394,if(lt(n,1643),(n-1621)*-0.0273/22+-0.0971,if(lt(n,1660),(n-1643)*0.0152/17+-0.124,if(lt(n,1682),(n-1660)*0.147/22+-0.109,if(lt(n,1707),(n-1682)*0.0649/25+0.0382,if(lt(n,1748),(n-1707)*0.0115/41+0.103,if(lt(n,1761),(n-1748)*-0.0764/13+0.115,if(lt(n,1771),(n-1761)*-0.0716/10+0.0382,if(lt(n,1797),(n-1771)*-0.0516/26+-0.0334,if(lt(n,1846),(n-1797)*-0.0394/49+-0.085,-0.124)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))':eval=frame

嗯,但是它确实有效,并且效果非常好!

但我的问题是:是否有人知道是否有办法让eq过滤器直接读取 YAVG 元数据值,drawgraph并避免使用多边形函数进行所有工作?

相关内容