关于动态壁纸这边,其实已经不需要再谈什么东西了,现有的各种文章都在介绍相关的技术。可以说现如今要去制作一个桌面动态壁纸应该不是什么难事。我考虑了很久,决定还是开一篇单独谈谈。可能我说的也不全部正确,您有什么建议随时可以提。
首先,我们常常见到个人开发者开发的动态壁纸小程序,一般都采取使用视频播放器的形式实现动态壁纸。这样的话实现相对简单,但是不利于扩展。要真正实现一个动态壁纸套件,其实除了视频播放器还需要一个定制化的 Web 浏览器,因为在前端技术成熟的今天,网页能够做到更多的交互和动画。
下面我从两个角度去谈怎么写动态壁纸的 Player:
第一种是视频播放器模式的,我个人推荐 ffmpeg 或者 mpv 两款播放器的框架,不要使用 libvlc。因为它有点小坑。libvlc 的较新版本中针对 Alpha 通道视频的呈现有严重失真的问题,官方和社区都没有解决方案,除非回退版本。
最重要的,如果要实现悬浮画的效果(窗口背景透明,无电影黑边、窗口边框和窗口装饰),则必然涉及到解码播放 mov 或者 WebM 格式视频。而实现窗口透明则通过修改播放器渲染输出窗口(或者背景窗口)的样式,即通过 WS_EX_LAYERED 设置分层窗口,然后使用 SetLayeredWindowAttributes(hOutputTargetWnd, RGB(0,0,0), 250, LWA_ALPHA | LWA_COLORKEY) 减除窗口中的黑色颜色,这样就可以实现除渲染以外的部分完全透明了。
mov 本身可以存储 Alpha 透明通道,如果提供的视频源是不支持透明通道的 mp4 或者 avi 等,则可以通过 OpenCV 强大的背景减除算法去除背景,并以 mov 等格式保存视频流。
第二种则是网页端的实现,这里就相对复杂些了,可玩性也比较多,如跨屏动态壁纸、鼠标视差动画、按钮响应操作、鼠标跟随拖尾等等。
这里就先简单谈谈网页端播放视频吧,前端有很多成熟视频播放组件,例如常见的 Video.js。这里就涉及到一个点,隐藏网页的右键菜单、部分快捷键(如切全屏/窗口等)以及不要显示进度条等装饰性的元素。
好了,时间不多,就简单写这些,后面有空或者有兴趣再补充。