如果可能的话,我想使用 FFMPEG 添加胶片颗粒效果。
采用干净的计算机渲染场景和滤镜,打造出粗糙的黑白 16 毫米胶片外观。举个例子,比如职员https://www.youtube.com/watch?v=Mlfn5n-E2WE
根据模拟电视噪声我应该能够使用以下滤波器
-filter_complex "geq=random(1)*255:128:128;aevalsrc=-2+random(0)"
Run Code Online (Sandbox Code Playgroud)
但是当我将它添加到我的 ffmpeg 命令中时
ffmpeg.exe -framerate 30 -i XYZ%05d.PNG -vf format=yuv420p -dst_range 1 -color_range 2 -c:v libxvid -vtag xvid -q:v 1 -y OUTPUT.AVI
Run Code Online (Sandbox Code Playgroud)
所以现在的命令是
ffmpeg.exe -framerate 30 -i XYZ%05d.PNG -vf format=yuv420p -dst_range 1 -color_range 2 -c:v libxvid -vtag xvid -q:v 1 -y -filter_complex "geq=random(1)*255:128:128;aevalsrc=-2+random(0)" OUTPUT.AVI
Run Code Online (Sandbox Code Playgroud)
我收到消息
Filtergraph 'format=yuv420p' 是通过输出流 0:0 的 -vf/-af/-filter 选项指定的,该输出流由复杂的 filtergraph 提供。-vf/-af/-filter 和 -filter_complex 不能对同一流一起使用。
如何更改 ffmpeg 命令行以使颗粒过滤器正常工作?另外,我可以添加一点模糊吗?旧的 16mm 看起来更像是模糊的,而不是颗粒状的。
感谢您的任何提示。
我只需要制作胶片颗粒,并想要一些“更整洁”的东西,而不仅仅是随机化每个像素。这就是我想到的:FFmpeg filmgrain。
它从白噪声开始:
然后它使用“deflate”和“dilation”过滤器使某些特征扩展到多个像素:
效果非常微妙,但您可以看到噪声中存在一些较大的白色和黑色“斑点”。这意味着噪声的特征不再只是直接的单个像素。然后,该图像的分辨率减半,因为它以目标视频分辨率的两倍进行渲染。
现在,最高分辨率的细节已被柔化,并且像素块的尺寸减小至 1-2 个像素。所以,这就是噪声平面。
然后,我获取源视频并对其进行一些处理。
去饱和:
过滤亮度,使输入像素越接近亮度级别 75(通过实验得出),该像素越亮。如果输入像素更暗或更亮,则输出像素均匀地更暗。这会创建亮度级别接近 75 的亮度“带”。
然后按比例缩小,这就是噪声水平被“调整”的地方。这种频带选择意味着我们将专门在帧中最受关注的区域添加噪声。不在其他区域添加噪声会留下更多比特来对噪声进行编码。
然后将该缩放掩模应用于先前计算的噪声。在此屏幕截图中,我删除了调整,以便可以轻松看到噪音:
带状滤波器未选择的区域被大大缩小并且基本上是黑色的;噪声变化消失得无影无踪。
这是缩放因子为 0.32 时的样子——非常微妙:
然后我反转该图像,使没有噪声的部分为纯白色,然后有噪声的区域从白色稍微下拉:
最后,我拉出同一源视频的另一个副本,将计算出的图像作为 Alpha 通道应用到其中,并将其覆盖在黑色上,这样白色稍差的胶片颗粒点就会变成稍暗的像素。
效果非常微妙,当它不移动时很难在静止图像中看到,但如果你将噪音调高,你可以获得像这样的帧:
滤波器"geq=random(1)*255:128:128;aevalsrc=-2+random(0)"
用于白噪声
对于“粗糙的黑白 16 毫米胶片外观”,您想要类似的东西,
-vf hue=s=0,boxblur=lr=1.2,noise=c0s=7:allf=t
Run Code Online (Sandbox Code Playgroud)
您format
指定的是一个过滤器,并且应用于输入的所有过滤器都应在单个链中指定,因此应该是,
-vf hue=s=0,boxblur=lr=1.2,noise=c0s=7:allf=t,format=yuv420p
Run Code Online (Sandbox Code Playgroud)
请参阅https://ffmpeg.org/ffmpeg-filters.html上的过滤器文档,了解描述和可以调整的参数列表。