【教程】雷蛇键盘灯播放视频

准备工作
准备一把雷蛇 RGB 键盘
下载并安装 Razer Synapse 雷云
下载 Razer Chroma SDK Sample Application(当然,也可以直接下SDK)
下载并安装 Microsoft Visual Studio(可选,如果你喜欢折腾)
Step 0
可能有小伙伴会问为什么不直接用 Chroma Studio 里的环境感知效果,或者使用 Wallpaper Engine 的联动效果。

当然也是可以的。不会你会发现即使把混合属性拉到最左边(锐利),也根本看不清视频的内容。
这个效果可能更加适合日常使用,可以实现一个自适应亮度的效果,即屏幕越亮,键盘灯越亮,屏幕越暗,键盘灯越暗。
Step 1
要实现近似这两个视频中的效果,其实只有一个 step 。


找到 Sample Application 中 Release 文件夹下的 RazerChromaSampleApplication.exe ,运行并点击 Ambient effect - Start Ambient Effect 即可。

现在你的键盘就会显示屏幕上的内容了。
Step 2
那么为什么我说是近似呢,因为我对这个程序的内容进行了一些修改。
太长不看的小伙伴可以直接在文章末尾下载修改后的程序。
首先我们来看一下官方的程序是怎么写的。
实现 Ambient Effect 的部分在 AmbientEffectDlg.cpp 的 _CreateAmbientFx1 函数中:


DeviceType 表示的是需要控制的设备种类,为 1 时表示键盘,这里为了方便只保留了键盘的逻辑部分。
13 至 25 行,获取屏幕的分辨率信息并进行一些初始化;
29 至 61 行,设置如何缩放屏幕内容;
63 至 83 行,将缩放的屏幕直接显示在键盘上;
87 行的 Sleep 控制刷新速度。
首先注意一下缩放的部分:
32 行的 SetStretchBltMode 指定拉伸模式为 HALFTONE ;
37 至 39 行,进行缩放并上下翻转。
SetStretchBltMode 能够指定 4 种本质不同的拉伸模式:COLORONCOLOR、HALFTONE、BLACKONWHITE、WHITEONBLACK。
其中后两者类似 PS 中的变暗和变亮,在每个区域内取出最暗/亮的像素,完全不适合播放视频。
COLORONCOLOR 相当于直接采样,固定间隔抽取像素,其他像素直接丢弃;
HALFTONE 在缩小图像时,每个像素是其对应区域内颜色的平均值,是最为常用的拉伸模式,但处理速度最慢。
我尝试了这几种拉伸模式,HALFTONE 对于单幅静止画面的表现是最佳的,而在图像连续运动时,COLORONCOLOR 的表现效果则更佳。HALFTONE 的平均操作容易将画面中的一些细节抹去;COLORONCOLOR 在图像连贯运动的过程中能够较好的展现出细节,但在画面趋于静止时,画面容易崩坏。




最早我使用的测试视频为 Daisuke,在 HALFTONE 模式下人物的手部动作不能很好的看出来。而在 COLORONCOLOR 模式下,虽然有些支离破碎的感觉,但手部的运动基本都能看出来了。因此之后我均选用了 COLORONCOLOR 模式。
当然,在其他一些视频中,原来的 HALFTONE 模式效果可能会更佳。两种模式各有优劣,考虑到多方面因素(视频内容、处理速度,以及接下来的一个 step),我还是选择了 COLORONCOLOR 模式。
Step 3
考虑进一步优化,我发现了这样一个事实。
这个程序是把键盘当作一块 8 × 24 (实际只用到了 6 × 21)的屏幕进行显示。
但我们都知道:

在键盘的主要部分,按键在纵向并不是直线摆放的,因此这样会造成视频的一些扭曲。
为了修正这个扭曲,我对键盘和像素进行了重新映射。
首先我从某电商平台找到了一张键盘的俯视(平面?)图:

然后截取键盘部分,缩放宽度至 1080 ,测量每个按键的中心点横坐标。
于是我得到了这样的一个矩阵:

然后修改缩放结果为 6 × 1080,对于每个键盘灯读取所在行对应横坐标的像素颜色。

即得到最终我所使用的程序。
HALFTONE 模式也可以进行类似的修正,但是会更加麻烦一些,需要计算每个键对应的区域及区域中的平均颜色。
总结
其实直接用 Sample Application 的效果已经相当不错了。
如果你更喜欢修改后的效果,可以下载这个程序:
链接:https://pan.baidu.com/s/13gmR9QStHR_iv-Svi-PiBg
提取码:6juc
修改后的源代码:
链接:https://pan.baidu.com/s/11mQOBc4-5Tmis5fOu0BSgg
提取码:efct
所以其实我基本没有写什么代码,确实没有什么技术力。有时间了再写一些有意思的灯光效果吧(比如在键盘上玩游戏)。