我有一个树莓派,我想从它流式传输网络摄像头视频。我想让它与我的 Windows Mobile 手机(或任何其他带有浏览器的设备)兼容,因此 mjpeg 流是不可能的。事实上,我无法找到一种可以在 Linux 上进行流传输的格式。在我的 Windows 机器上,我使用 WebcamXP 来传输网络摄像头视频,效果很好 - 该软件将 jpeg 转储到一个文件夹中,并且在浏览器中有一个简单的 js 脚本,每 40 毫秒获取这些 jpeg 一次。这不是一个“漂亮”的解决方案,但我想在我的树莓派上实现同样的目标。
问题是,我找不到任何能够以 >1fps 将 jpeg 转储到文件夹中的软件。我知道 mplayer 和 vlc 可以做到这一点,但它们输出的图像是绿色的,我找不到一种方法让它们看起来正确(我尝试了几天)。有趣的是,motion 和 fswebcam 无需任何配置即可输出良好的视频,但它们不支持足够快地转储 jpeg - 它们只能每秒制作一次快照。
假设我找不到修复 mplayer/vlc 中视频的方法,有两种方法可以解决此问题: 1. 找到正确转储图像的程序/实用程序 2. 将流从运动转换为 jpegs
设置服务器并编写 js 脚本不是问题,我只需要从网络摄像头将 jpeg 源源不断地获取到文件夹中即可。
答案1
最后我让它与 mplayer 一起工作。结果发现 mplayer 只是有无效的色调和饱和度值。不知道为什么,但我也看到其他人对此抱怨。这是我最终使用的命令:
mplayer -really-quiet -tv driver=v4l2:height=320:width=240:quality=1:hue=35:saturation=-80:brightness=99:contrast=-88:fps=8:device=/dev/video0 tv:// -vo jpeg -saturation -50 -contrast -3 &
它以 8fps 的速度将 jpeg 转储到文件夹中,这足以满足我的需求。
除了这个脚本之外,我还运行了一个脚本,该脚本会从文件夹中删除超过 8 秒的图像。我用了 8 秒来保持较低的 CPU 使用率,因为这是 pi 上的宝贵资源:
cd /home/pi/webcam_frames
while true; do
find . -not -newermt '-8 seconds' -delete
sleep 8;
done
还有一个每秒创建 10 次指向最新图像的符号链接的脚本。
cd /home/pi/public
sleep 2
rm -rf latest.jpg
while true; do
ln -s -f /home/pi/webcam_frames/`ls -rt /home/pi/webcam_frames | tail -n1` latest.jpg
sleep 0.1
done
这个符号链接位于公共目录中,可以通过nodejs从浏览器中获取:
var express = require('express'),
app = express(),
port = 8888;
app.use(express.static('/home/pi/public'));
app.listen(port);
我有一个简单的 html+js 页面,它每秒从 nodejs 获取符号链接图像几次,因此我有 5-8fps 的视频,可以在每个可以处理 javascript 的设备上运行。
这是一个丑陋的解决方案,结果也很丑陋,但这正是我所需要的。