Neko 虚拟摄像头:4 步跑通 FFmpeg 视频源循环播放
【免费下载链接】nekoA self hosted virtual browser that runs in docker and uses WebRTC.项目地址: https://gitcode.com/GitHub_Trending/ne/neko
读完本文你能解决一个具体问题:机器上没有摄像头硬件时,如何让 Neko 容器内网页的摄像头位置显示一段循环播放的视频。宿主机上装一个内核模块、挂载一个设备、跑一条 FFmpeg 命令,全程约 5 分钟。
🎬 没有摄像头时,摄像头位置放什么
远程演示、视频类网页的自动化测试、长时间占屏展示——场景都需要"一个摄像头",但机器上并没有摄像头硬件。你不必去买硬件:用 FFmpeg 把一段视频循环推流,再让 Neko 的容器化浏览器把它当摄像头用,网页端就能正常枚举并选中这个摄像头设备。
🧭 原理速览:谁在放录像带,谁在当插座
先用三句话讲清三者的关系。FFmpeg(开源视频处理工具)负责把视频文件逐帧解码,按实时速度输出裸帧数据。v4l2loopback(一个 Linux 内核模块)在系统里造出一个名为/dev/video0的虚拟视频设备,Linux 的 v4l2 视频设备接口会把它识别成"摄像头"。类比一下:FFmpeg 是放录像带的机器,/dev/video0是电视插座,网页是电视机——插上去就亮,浏览器侧不需要任何改造。
⚙️ 分步实操:虚拟摄像头 4 步配好
- 宿主机加载 v4l2loopback
sudo apt install v4l2loopback-dkms v4l2loopback-utils linux-headers-$(uname -r) sudo modprobe v4l2loopback exclusive_caps=1exclusive_caps=1允许多个应用同时读取同一个虚拟设备。
- 把设备挂载进 neko 容器
在你的部署 compose 文件里加一行 devices,然后重启容器:
devices: - /dev/video0:/dev/video0- 用 FFmpeg 推循环视频
ffmpeg -re -stream_loop -1 -i demo.mp4 -vf scale=1280:720 -pix_fmt yuv420p -f v4l2 /dev/video0-stream_loop -1表示无限循环,-re表示按视频原始速度实时输出。
- 验证
v4l2-ctl --list-devices输出里能看到 v4l2loopback 即说明设备就绪。打开 Neko 的网页、在摄像头选择里选这个设备,画面就是循环视频。
🔁 进阶调优:性能与兼容各记两点
性能调优
- 分辨率选 1280x720 即可,大多数视频页面用不到 1080p
- 用
-r 24限制输出帧率,帧率减半 CPU 占用约减半 - 源文件解码吃力时,先转成 H.264 + yuv420p(最通用的视频像素格式)再推流
兼容性注意
- v4l2loopback 是宿主机内核模块,Neko 跑在 Docker 里也必须在宿主机安装并加载,设备要挂载进容器
- 部分网页只接受固定分辨率,无信号时对照页面设置对齐
-vf scale的尺寸 - Neko 官方文档将 webcam 相关功能标记为实验性,个别平台可能不可用
🧯 问题排查:三个最常踩的坑
FFmpeg 报Unable to open /dev/video0现象:命令立即退出 原因:v4l2loopback 模块未加载,或设备没有挂载进容器 解决:宿主机执行 modprobe,compose 补上 devices 行,重启容器
网页摄像头是黑屏现象:FFmpeg 推流正常,页面预览无画面 原因:分辨率或像素格式与页面要求不匹配 解决:-vf scale与-pix_fmt对齐页面实际使用的尺寸,1280x720 + yuv420p 最稳妥
视频只播一遍就停住现象:播完一次后画面停在最后一帧 原因:缺少-stream_loop -1参数 解决:补上该参数;若播放速度过快,再检查是否漏了-re
收束
配完之后,"摄像头"变成了一个你用一条命令就能控制的视频文件,演示、测试、占屏展示共用同一套配置。延伸阅读:官方摄像头配置说明 webpage/docs/configuration/capture.md。
【免费下载链接】nekoA self hosted virtual browser that runs in docker and uses WebRTC.项目地址: https://gitcode.com/GitHub_Trending/ne/neko
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考