V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
irainy
V2EX  ›  Raspberry Pi

用树莓派搭建网络摄像头

  •  
  •   irainy · 2015-05-26 21:49:11 +08:00 · 12513 次点击
    这是一个创建于 3257 天前的主题,其中的信息可能已经有所发展或是发生改变。

    >> original blog

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

    raspberry pi 2b

    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 等选项:

    raspi_config

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

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

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

    内存:1 GB(与GPU共用)
    irainy
        15
    irainy  
    OP
       2015-05-27 00:37:42 +08:00 via iPhone
    @wwqgtxx 当然ffmpeg 未必是最优的解决方案 但确实可以让这个功能快速run起来(虽然编译ffmpeg 非常非常慢) 再进行后面的优化跟扩展 非常感谢前面提几位
    @cevincheung
    @sennes
    提出的方案,我时间我会继续探索尝试,也欢迎其他人继续提出建议跟讨论⁽⁽◝( ˙ ꒳ ˙ )◜⁾⁾
    sennes
        16
    sennes  
       2015-05-27 00:47:00 +08:00   ❤️ 1
    @irainy 印象中树莓派有编译好的mjpg-streamer
    之前在PCduino(它的配置比pi要好很多)上跑过,1080P@60fps是没有问题的(局域网传输~
    cevincheung
        17
    cevincheung  
       2015-05-27 00:49:51 +08:00   ❤️ 1
    @irainy ffmpeg有binary不用编译
    liberize
        18
    liberize  
       2015-07-01 12:58:56 +08:00 via iPhone
    还是 usb 摄像头便宜啊,而且可以 720p
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4122 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:13 · PVG 18:13 · LAX 03:13 · JFK 06:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.