首页 > 解决方案 > ffmpeg过滤器表达式调用了什​​么随机函数?

问题描述

例如random(-1)在 geq 中:

ffmpeg -f lavfi -i nullsrc=s=10x10:r=25:d=4 -vf geq=lum='255':cb='255*random(-1)':cr='255*random(-1)',scale=200:200:flags=neighbor -bf 0 test.mp4

我总是在第一帧中得到完全相同的前 2 个像素的颜色。第一帧总是有非常相似的颜色。从第 3 帧开始,开始变得更好。此外, random() 似乎只在单帧内引入随机。每一帧的第一个像素的顺序完全相同:

ffmpeg -f lavfi -i nullsrc=s=1x1:r=25:d=4 -vf geq=lum=255:cb='255*random(-1)':cr='255*random(-1)',scale=10:10:flags=neighbor -vframes 10 f%05d.png

第一次运行

第二次运行

我查看了源代码,但看不到实际调用了什么随机函数:

        case e_random:{
            int idx= av_clip(eval_expr(p, e->param[0]), 0, VARS-1);
            uint64_t r= isnan(p->var[idx]) ? 0 : p->var[idx];
            r= r*1664525+1013904223;
            p->var[idx]= r;
            return e->value * (r * (1.0/UINT64_MAX));
        }

我如何在 geq 中获得适当的随机性?

标签: ffmpeg

解决方案


它使用带有乘数 1664525 和增量 1013904223的线性同余生成器。

您当然可以修改它以满足您的需求。查看av_get_random_seed更多随机性来源。


推荐阅读