用树莓派搭建网络摄像头

2015-05-26 21:49:11 +08:00
 irainy

>> original blog

用树莓派加上相机模块,可以实现实时监控的功能,再将时时视频流导入到 Web 界面中,就变成简单的网络摄像头(Webcam)。Web 端用 Nodejs + WebSocket,既可以进行实时播放,同时又方便进功能的扩展。

Raspberry PI 2B 在硬件上比第一代有很大提升,多了两个 USB 接口,存储换成了 Micro SD。摄像模块 支持1&2代,通过 HDMI 旁边的 CSI CONNECTOR 接口接入。

下面介绍 Webcam 的搭建过程。

1. 安装 Raspbian 操作系统

官方下载 系统镜像,Mac 系统下刻制系统镜像到 SD 卡中的步骤如下:

# 1. 
diskutil list

# 查看 SD 卡所属文件
#/dev/disk2
#   #:                       TYPE NAME                    SIZE       IDENTIFIER
#   0:     FDisk_partition_scheme                        *7.9 GB     disk2
#   1:                 DOS_FAT_32 NO NAME                 7.9 GB     disk2s1

# 2.
diskutil unmountDisk /dev/disk2

#Unmount of all volumes on disk2 was successful

# 3.
sudo dd bs=1m if=2015-05-05-raspbian-wheezy.img of=/dev/disk2

# 3125+0 records in
# 3125+0 records out
# 3276800000 bytes transferred in 1562.948501 secs (2096550 bytes/sec)

# 4.
sudo diskutil eject /dev/disk2
# 这一步可能会需要相当长的时间

# Disk /dev/disk2 ejected

刻制完成后可以将 SD 卡插入 PI 的卡槽中,通电即可开机(第一次还是需要用 HDMI 接显示器,操作更方便一些)。

2. 系统配置

第一次进入 raspbian 系统需要进行相关系统配置sudo raspi-config,包括选择使用全部 SD 卡作为系统存储、开启 Camera module 等选项:

插入 USB WIFI 后,配置 WIFI 连接,参考 SETTING WIFI UP VIA THE COMMAND LINE。最后,更新一下源(推荐 mirrors.zju.edu.cn :D,或者阿里云):

sudo nano /etc/apt/sourses.list

# deb http://mirrors.zju.edu.cn/raspbian/raspbian/ wheezy main contrib non-free rpi
# deb-src http://mirrors.zju.edu.cn/raspbian/raspbian/ wheezy main contrib non-free rpi

sudo apt-get update

3. Camera module 操作指令

raspbian 中系统自带对摄像头的操作指令,分别是raspistill, raspivid & raspistillyuv(这里有官方详细文档),其中 raspivid 是获取视频流的指令。

# 捕捉 5s 视频并输出到 video.h264,视频尺寸为 320x240
raspivid -t 5000 -w 320 -h 240 -o video.h264

# 实时监控并输出到 stdout
raspivid -t 0 -w 320 -h 240 -o -

获取实时监控之后的视频流输出之后,可以通过 ffmpeg 转化视频格式,输出到监听服务器。

4. 安装 Nodejs/ffmpeg

# 1. install nodejs
wget http://node-arm.herokuapp.com/node_latest_armhf.deb
sudo dpkg -i node_latest_armhf.deb
node -v

# 2. install ffmpeg
## libx264 support
git clone git://git.videolan.org/x264
cd x264
./configure --host=arm-unknown-linux-gnueabi --enable-static --disable-opencl
make
sudo make install

## ffmpeg
git clone git://git.ffmpeg.org/ffmpeg
cd ffmpeg
sudo ./configure --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree
make # 这一步可能相当相当漫长,在我这里跑了有一个多小时
sudo make install

5. Webcam

通过 ffmpeg 转换视频格式:

raspivid -t 0 -w 320 -h 240 -o - | ffmpeg -i - -s 320x240 -f mpeg1video \
-b 800k -r 30 http://127.0.0.1:8082/yourpassword

同时创建 Node server 监听 http://127.0.0.1:8082(参考:jsmpeg):

git clone https://github.com/phoboslab/jsmpeg.git webcam
cd webcam && node stream-server.js yourpassword

# Listening for MPEG Stream on http://127.0.0.1:8082/<secret>/<width>/<height>
# Awaiting WebSocket connections on ws://127.0.0.1:8084/

然后打开stream-example.html就可以看到实时监控画面了,如果是远程调试需要稍作更改:

# edit stream-example.html
var client = new WebSocket( 'ws://RASPI_LOCAL_IP:8084/' );
        var player = new jsmpeg(client, {canvas:canvas});

# @/path/to/webcam
python -m SimpleHTTPServer 8080

# in your browser
http://RASPI_LOCAL_IP:8080

参考

  1. Setup Node.js on Raspberry Pi 2 B
  2. Installing FFMPEG for Raspberry Pi
  3. HTML5 LIVE VIDEO STREAMING VIA WEBSOCKETS
12610 次点击
所在节点    Raspberry Pi
18 条回复
kiritoalex
2015-05-26 22:35:36 +08:00
问一下,楼主试着在RPi上跑过RStudio吗?
irainy
2015-05-26 22:42:27 +08:00
@kiritoalex 跑R我估计都悬 Pi不太适合跑图形界面吧
lch21
2015-05-26 22:47:18 +08:00
单纯为实现功能的话,还是安卓手机价格便宜
kiritoalex
2015-05-26 22:47:20 +08:00
@irainy Rstudio server
sennes
2015-05-26 22:48:04 +08:00
这个感觉效果会比 mjpg-streamer 要好?
不过配置起来好像要麻烦一点点。
irainy
2015-05-26 22:50:10 +08:00
@lch21 哈哈 是的 PI+Camera 将近350,还不如买个小米摄像头便宜呢,不过这是为了后面加入人脸识别以及其它扩展功能,所以折腾起来比较方便
irainy
2015-05-26 22:50:52 +08:00
@kiritoalex 没用过诶 跑起来说不定行 但是这点内存 运算速度堪忧啊
kiritoalex
2015-05-26 23:05:23 +08:00
@irainy 你有telegram吗?
irainy
2015-05-26 23:15:09 +08:00
@kiritoalex ㄟ( ▔, ▔ )ㄏ
cevincheung
2015-05-26 23:20:25 +08:00
ffmpeg+nginx(rtmp+hls)
kiritoalex
2015-05-26 23:21:08 +08:00
@irainy 讲真。。乃不用IM吗?
irainy
2015-05-26 23:28:40 +08:00
@kiritoalex wechat...
wwqgtxx
2015-05-27 00:07:57 +08:00
话说这个分辨率也太低了吧320*240,个人觉得540p以下的分辨率基本上啥也看不清
而且编译ffmpeg不能交叉编译么?用树莓派的cpu编译真的好慢的
wwqgtxx
2015-05-27 00:15:21 +08:00
而且我查了一下,树莓派2支持硬件解码,为什么非要用ffmpeg来软解码呢?

视频编码与解码:
1080p30 MPEG-2 and VC-1解码器(已授权)

1080p30 h.264/MPEG-4 AVC高配置解码器与编码器

内存:1 GB(与GPU共用)
irainy
2015-05-27 00:37:42 +08:00
@wwqgtxx 当然ffmpeg 未必是最优的解决方案 但确实可以让这个功能快速run起来(虽然编译ffmpeg 非常非常慢) 再进行后面的优化跟扩展 非常感谢前面提几位
@cevincheung
@sennes
提出的方案,我时间我会继续探索尝试,也欢迎其他人继续提出建议跟讨论⁽⁽◝( ˙ ꒳ ˙ )◜⁾⁾
sennes
2015-05-27 00:47:00 +08:00
@irainy 印象中树莓派有编译好的mjpg-streamer
之前在PCduino(它的配置比pi要好很多)上跑过,1080P@60fps是没有问题的(局域网传输~
cevincheung
2015-05-27 00:49:51 +08:00
@irainy ffmpeg有binary不用编译
liberize
2015-07-01 12:58:56 +08:00
还是 usb 摄像头便宜啊,而且可以 720p

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/193950

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX