使用FFMPEG模拟CRT监视器(PT.1:彩色CRT)

2021-03-07 11:57:27

这只是一个有趣的小实验,我' ve在这里滋补了这里,最近有。你赢了'如果我们假装有这样的东西,那么&#34是"严肃的使用和#34;用于模拟CRT监视器。那个'主要是由于在CPU上做到这一切的速度。

我不是在开玩笑"慢" - 如果您实际上希望将其应用于超过几秒钟的视频,以优良的质量,请准备好通过糖蜜运行马拉松的冰川。当然,有一大吨着色器,用于你最喜欢的仿真器,实时在GPU上做到这一点,但我不知道只需将它们应用于独立形象或视频的方式文件而不撕毁你的发发。

(FFMPEG也可以被告知使用GPU,但不是所有东西 - 也是它的GPU加速ISN' T便携和#39;无论如何,似乎更快地制造了东西。如果你知道某种方式这些缺点,那个' d很高兴知道。)

此脚本(仅适用于Windows批处理文件)将允许您在图像或原始分辨率素材的视频上执行CRT变换。您可以在https://github.com/viler-int10h/ffmpeg-crt-transform中获取它,其中包含您的所有内容和#39;除了FFMPEG本身之外还有所需的一切。

YouTube视频示例将向您展示运动的效果,但这里有一些静止图像结果较高的分辨率:

除了上面包含的文件之外,您' ll只需要在路径中有ffmpeg.exe / ffprobe.exe。 '仍然是静止图像的批量文件,另一个用于播放静止图像和视频的视频;要调用,刚刚运行:

如果省略了输出文件名,则脚本将使用与附加的输入相同的名称和#34; _out"

您' ll查看在运行期间正在创建的一些临时文件(" tmp *"除非出现问题,除非出现问题,脚本在它所完成后自身清除;事实上所有文件都以&#34开头; TMP"在当前目录中将被删除,所以尽量不要有任何。如果ffmpeg在任何时候返回错误,则脚本中止而不删除临时文件,因为它们可能会帮助调试。

对于视频,请记住这一点:输出将始终处于RGB颜色空间/像素格式,因为这些脚本采用RGB输入并尝试保留颜色信息。具体而言,精确的FFMPEG参数是-c:v libx264rgb -crf 8(所有中间步骤用于其临时文件的-crf 0,以防止无损)。

为了更好地与编辑应用程序兼容,以及在视频共享和流式服务上的更好的色彩再现,您可能希望自己转换成yuv颜色空间。更多信息如何最佳地完成此操作将在未来的帖子中。

CONFIGFILE参数指定配置文件,该配置文件是调整模拟选项的位置:缩放,阴影屏蔽参数,像素模糊,光晕(由散射/反射效果引起的漫反射发光),扫描线轮廓,梁绽放(其中更明亮的像素扫描线看起来更宽),表面曲率(凸起),角半径和小插图(朝向CRT表面的边缘变暗)。

所有这些元素都表征了功能管显示的正常输出 - 我试图远离"审美修正主义"所以你赢了' t找到噪音,色差,重影,假闪烁等东西。梁径,同步错误和其他'毛刺'视觉效果。如果您喜欢这样的事情,FFMPEG可以很好地将它们拉出,因此您可以随时添加到脚本。

下载包含一些配置文件以启动您。在这里,'&s一个,所以你可以感受到你可以调整的内容:

; ffmpeg crt脚本配置文件(注释以分号开始);这个例子适用于已经两倍的低分辨率VGA输入;扫描(如Dosbox通过机器= VGAONLY生产),例如: 640x400;为1:1输入(例如320x200),为SX和SY的值加倍,并设置; scan_factor to double .;输入预缩放+纵横比调整:------------------------------- SX 5;宽度尺度因子(整数)SY 6;高度比例因子(整数);较大的因素=加工较慢,质量更好;最终输出缩放:------------------------------------------------------------------------------------------------------------------------------------ --------- OY 1080;输出高度(宽度将设置为高度* 4/3)Omargin 8;包括边距的最小宽度(边缘填充)OFILTER LANCZOS;输出缩放滤波器;推荐:' lanczos'为了 ; Triad Shadowmask,'高斯'对于槽/格栅(减少;莫尔);有关所有可用值,请参阅FFMPEG Scarer选项;仿真设置:-------------------------------------- --------- OVL_TYPE三合会;荫罩(磷光体覆盖层)类型,例如三合一,;插槽,格栅。 " _ .png"必须存在.ovl_scale 0.08;暗影掩模的规模因子imageovl_alpha 0.6;暗影掩模不透明度(0..1)OVL_BRIGHTFIX 2.05;亮度倍增器在彩色叠加后应用 - ;补偿明显的黑暗_px_blur 50;水平像素模糊因子(像素宽度的百分比)V_PX_BLUR 12;垂直像素模糊因子(像素高度的百分比) - ;如果Scanlines是EnableDhalation_ON NO,通常应该是0;加入下晕?HALATION_RADIUS 30; - radiushalation_alpha 0.12; - 不透明度(0..1)ScanLines_on是的;添加扫描线?SL_ALPHA 0.8; - 不透明度(0..1)SL_weight 1; 0..1对于纤维梁,> 1用于静止的beamscan_factor单身;扫描线数与输入高度的比率:'单'; '双倍',或'半' bloom_on是的;添加Scanline Bloom? (扩大较大的扫描线)Bloom_Power 0.65; - 绽放因素:0(无).. 1(满);对于较小的扫描线重量_Radius 0更加明显;圆形边框角落的半径; 0以禁用0.04; CRT曲率(桶形变形); 0到disablevignette_on是的;添加小插图效果? (使图像变为边缘)Vignette_Power 0.1; - 变暗量;仅限视频 - 对静止图像没有影响:-------------------------------- P_Decay_Factor 0;磷衰减因子(0..1) - 指数:< 0.9是;非常温和,0.95 =重,0.99 =很长,1.0 = Infinitep_decay_alpha 0.5; - 不透明度(0..1) - 0.3到0.5似乎逼真

我赢了' t进入批处理文件中的每一行正在做什么(如果你看它,你' ll明白原因),但一般流程是这样的:

设置:确保在命令行参数中确保没有搞笑,获取输入尺寸(使用ffprobe),阅读配置设置。

圆角,如果启用:绘制四分之一圆圈(使用FFMPEG' S GEQ滤波器),将其缩放到所需的尺寸(Corner_Radius)与抗锯齿,四种方式旋转;创建与缩放输入相同尺寸的空白画布,并将结果放在角落中。使用所需的CRT曲率因子(曲率)涂抹透镜粗校滤波器。结果是临时图像,其将用作透明层,除了四个角落。您可能想知道为什么我们已经在这里应用了曲率,当我们稍后可以在单一的通过时,当已经组合时,我们可以在一次通过。这将在下面得到解答,但现在我们'重新将这本层放在一边。

扫描线,如果启用:创建单个扫描线的灰度垂直配置文件,再次使用GEQ过滤器:亮度由正弦函数(使用SL_PEIGHT作为修饰符)确定,高度取决于缩放的输入维度和SCAN_Factor参数。这是为了获得扫描线的alpha地图。现在我们也向该图像添加了曲率 - 但是这次,我们在镜头粗校之前将其预先放置4倍,然后将其放在后面。这是必要的,因为ffmpeg' s镜头校正是最近的邻居插值,并且使用高频细节(例如这些扫描线),这会产生可怕的莫尔图模式。 4倍过采样遍及这一点,但该大小的运营是Cary Extreme CPU / RAM费用,以及为什么我们分开曲率通过:我们只想为静止图像层进行莫尔氏缓解,只有在严格必要时。

ShadowMask:荧光体覆盖的图像从相应的.png文件中取出,由指定的OVL_Scale因子(之前和之后的W / Gamma校正)缩小,然后铺平并裁剪以填充'屏幕' 。这也使抗Moiré曲率处理有4x过采样,并被保存为临时图像。

磷衰减(仅限视频):如果p_decay_factor是非零,请将输入视频拍摄,并将磷光体持久性模拟在其上升之前。为此,我们使用LagfunFilter,将衰减因子作为参数,并使用P_Decay_Alpha作为不透明度因子将结果与原始结果融为一。

输入缩放+像素模糊:拍摄原始分辨率输入图像(或有视频 - 或没有磷光体衰减),并通过配置的宽度/高度因子(SX / SY)高度升级,以获得更高的分辨率:此分辨率将用于所有中间步骤。然后,使用配置的PX_BLUR因子应用高斯像素模糊(GBLUR),但在使用LUTRGB应用2.2伽马变换之前,以确保伽马意识到模糊效果的应用。

晕机,如果启用:将上一步的输出分成两个流;将其中一个(使用HALate_radius)模拟,模拟电子束和荧光灯的轻微散射/反向散射引起的漫反射辉光;然后将其与其他未修改的流混合(使用&#39中的Blendfilter; Lighen'模式,具有Halation_alpha指定的不透明度因子)。

表面曲率,如果启用:现在我们'用伽玛长期模糊步骤完成,将逆(0.454545)伽马变换应用于我们的图像/视频;然后将其喂给透镜粗校过滤器以获取凸起效果,这次没有4x预缩放,因为莫尔之神在这里不是真正的问题,并且过采样实际视频就是疯狂慢。

梁绽放,如果启用:创建前一级的灰度版本和#39; S输出(图像/视频),因此我们只保留亮度信息。通过将饱和度设置为0 - 再次使用Gamma Transform在之前和之后再次使用Huefilter完成。现在我们将其与已经曲线的掩码混合在一起,我们之前放在一边,使用自定义Geq混合公式到" fatten"根据灰度流中的亮度,扫描线。刚刚创造了ve'刚刚创造了。结果是包含横向掩模的亮度掩模的视频/图像流,'梁绽放'包括。

混合所有的东西:拍摄我们' ve已经缩放,模糊,降临和弯曲的图像/视频;如果启用了Bleam Bloom - Do A'多个'与前一级的结果混合,将扫描线添加到盛开的盛开;如果它不是我们以前做过的原始扫描线面罩也是如此。 SL_ALPHA参数确定不透明度。 (如果禁用Scanlines,则不执行以上。)然后...拍摄曲线遮蔽镜像,做另一个'多个'融合(ovl_alpha设置的不透明度),并在我们'重新上时用圆角添加一个。因为扫描线和ShadowMask使图像变暗了一点,所以我们现在通过将每个颜色通道与OVL_BrightFix参数乘以(将结果削减到255)来补偿。

作物到内容:表面曲率失真在图像区域周围引入了一些多余的填充,因此该部分使用CropdetectFilter找到实际内容的尺寸,而无需额外的绒毛。为此,我们生成一个"假人"框架无需白色,使其通过相同的失真,并将其馈送到过滤器(3次,因为它需要可靠结果所需的最小帧数)。虚拟方法击败检查实际视频,因为(1)它' s更快,(2)如果您的视频以黑色框架开始 - 或者只是任何黑色,无论是延伸到边缘 - 它' d比无用更糟糕。

最终缩放+ Vignette:裁剪后,图像/视频按照保留4:3宽高比缩小到最终所需尺寸。这种缩放步骤也是伽马纠正的,如果你指定了一个非零汤,它' ll离开空间。缩放滤波器本身在配置(OFILTER)中指定 - 请参阅FFMPEG支持的列表中的Scarer选项。我们现在必须做的就是将存储宽高比(SETERAR)设置为1:1,因为前一步可能会击密它;将Vignettefor应用于边缘变暗效果(使用Vignette_Power参数);如果适用,垫与上述边距。

如果你还没有到期自然原因,你的CPU Hasn' t融化了,你现在有最后的结果!它值得吗? - 你告诉我。如果你能弄清楚加速这个过程的方法,或者在没有失去必需品的情况下使其更有效,或者让GPU放在一些真正的努力中,那也很酷。