在 Linux 的世界里,处理文本流是基本功。你可以轻松地从命令行对文本排序、合并、搜索。可你有没有想过,用同样的思路去处理视频?你一样能做到。也许你希望在把摄像头画面送入视频会议前,偷偷加上一个 logo;也许你想实时给画面加个模糊效果、调个色、或者标注几行字;甚至,你可能想直接在 Zoom 里播放一段事先录好的视频,却让对方以为这是你的实时影像。

这些事儿,Linux 都能干,而秘密武器通常就是同一个——一块回环视频设备。思路很简单:不再让应用程序直接读取 /dev/video0,而是利用 v4l2loopback 这个内核模块,凭空造出一台“假”摄像头。你的软件管线把处理过的画面写进这台假摄像头,然后各个应用就像读取普通摄像头一样读取它。结果出奇地强大。

打开网易新闻 查看精彩图片

第一步,安装回环驱动。在很多发行版上,它已经打包好了。如果你用 Debian 或 Ubuntu,装的是 v4l2loopback-dkms 包;在 OpenSUSE 里,如果用的是默认内核,大概就叫 v4l2loopback-kmp-default。如果系统没有自动加载模块,你就手动来,顺便告诉驱动要造几台假摄像头、放在哪个设备文件上。比如,我想要一台摄像头,挂在 /dev/video10,名字就叫 VirtualCam,就这样:sudo modprobe v4l2loopback devices=1 video_nr=10 card_label="VirtualCam"。做完之后,用 v4l2-ctl --list-devices 查一下,就能看到这台假摄像头已经在那儿了。只是,它现在还没有信号。

假设你有一台 USB 摄像头在 /dev/video0 上。用 FFmpeg 就能从它读数据,再直接把画面流灌到回环设备里:ffmpeg -f v4l2 -i /dev/video0 -vf format=yuv420p -f v4l2 /dev/video10。现在,所有应用都可以把 /dev/video10 当成摄像头来用了。这一步本身就很有用,因为它解耦了应用和物理设备。比如我有一台老旧的 Intel Lifecam,用浏览器开视频会议时偶尔会报错,可 FFmpeg 跟它处得挺好。靠类似的管线,我就能用这台老摄像头开会。而真正好玩的,是在里面插入各种滤镜——你可以去 webcamtoy.com 这种站点试试效果。

如果想加个水印,FFmpeg 的滤镜图系统非常灵活。水印就是另一路视频源叠在主画面之上。假设你有一张带透明通道的 PNG 文件 wrencher.png,下面这条命令能把它贴在画面右下角:ffmpeg -f v4l2 -i /dev/video0 -i wrencher.png -filter_complex "overlay=W-w-20:H-h-20,format=yuv420p" -f v4l2 /dev/video10。也可以写得更明确些:ffmpeg -f v4l2 -video_size 1024x720 -framerate 15 -i /dev/video0 -i wrencher.png -filter_complex "overlay=x=main_w-overlay_w-20:y=main_h-overlay_h-20,format=yuv420p" -f v4l2 /dev/video10。这样,logo 就会出现在离右下角边缘各 20 个像素的地方。不过还是要提醒一句:如果你的视频会做镜像翻转,这个方位可能在对方眼里看起来是左下角,得试一下才知道。

你看,仅仅靠一块假摄像头和几条命令,就能把视频流玩出那么多花样。它不只是技术上的小把戏,更像是在告诉你:你所见的画面,也许早已不是你原本的模样。那片水印、那层滤镜,也许就是一个人在数字世界里悄悄划下的边界。下次再盯着视频窗口时,你会不会也多看两眼,想一想它背后究竟经过了谁的手?