树莓派监控(1)—摄像头的使用

一 摄像头

最近想监控一下家里的猫在我上班时候干什么,本来打算买个小米或360的监控摄像头,价格也不贵。 想到树莓派吃灰了一段时间了,就想利用树莓派来做监控。树莓派官方发布了2款CSI接口的摄像头,当然树莓派有USB接口也可以使用USB摄像头。

树莓派摄像头

以上是官方摄像头的2个版本对比。型号是OV5647和IMX219,参考: Camera Module

去淘宝上搜索型号,基本都是以下面这些

型号 像素 模组 可调焦 红外 视场角(度)
RPi Camera V2 800万 IMX219 × × 62.2
RPi NoIR Camera V2 800万 IMX219 × 62.2
RPi Camera (B) 500万 OV5647 × 60.6
RPi Camera (D) 500万 OV5647 × × 66
RPi Camera (E) 500万 OV5647 × 69.1
RPi Camera (F) 500万 OV5647 75
RPi Camera (G) 500万 OV5647 × 160
RPi Camera (H) 500万 OV5647 160
RPi Camera (I) 500万 OV5647 × 170
RPi Camera (M) 500万 OV5647 × 200
RPi IR-CUT Camera 500万 OV5647 75.7
RPi IR-CUT Camera (B) 500万 OV5647 40
RPi Zero V1.3 Camera 500万 OV5647 × × 69.1
RPi FPC Camera 500万 OV5647 × × 72

这些都不是原厂的,同一个芯片的摄像头也有多个型号,有的支持调焦距,有的支持红外夜市(没有IR滤镜,需要配备红外线灯)。价格吃几十到上百不等,如果花100多买个摄像头我还不如直接买小米或360的监控摄像头了,所以我在淘宝上找了个最便宜的OV5647摄像头,加上运费20块。


二 连接树莓派

上面列举的都是CSI接口摄像头,上图中HDMI接口下方就是CSI接口。和摄像头通过排线连接,这里需要先把CSI接口上的卡子扣起来。 注意: 连接摄像头时一定关闭树莓派。

连接的时候排线蓝色部分对向网口,其实就是排线金属部分和CSI接口的针脚对上,反了就接触不上了。一般摄像头那一端是连接好的,没连接的话也一样。 然后扣好卡子。

这里要注意一点,就是摄像头和板子是可以分离的,所以连接树莓派之前检查一下摄像头和板子是否安装好了,否则会找不到摄像头。


三 测试摄像头

连接好之后,通电开机。开启摄像头功能

 sudo raspi-config

打开配置界面后选择: 5 Interfacing Options 然后选择 P1 Camera 选择YES开启摄像头模块, 然后重启。

➜  ~ vcgencmd get_camera
supported=1 detected=1

vcgencmd命令检查一下相机,supported表示是否支持相机,如果为0,需要检查一下系统升级,然后按上面方式打开相机模块。而detected表示是否连接好了相机,如果是0,请检查相机连线是否正确,摄像头和底板是否安装好。我当时就是底板松动,检查了很久。

vcgencmd命令还有很多其他功能,用来获取树莓派设备信息。使用vcgencmd commands 命令可以看支持的命令。


四 使用摄像头拍照

因为没有买相机固定支架,所以自己用盒子做了一个,方便拍照。当相机工作的时候,右上方的指示灯会亮。树莓派系统提供了拍照和录像的命令行工具。

There are four applications provided: raspistill, raspivid, raspiyuv and raspividyuv. raspistill and raspiyuv are very similar and are intended for capturing images; raspivid and raspvidyuv are for capturing video.

一般用的最多的是raspistillraspivid, 这些命令行工具都是基于OpenMAX。

All the applications are driven from the command line, and written to take advantage of the MMAL API which runs over OpenMAX. The MMAL API provides an easier to use system than that presented by OpenMAX. Note that MMAL is a Broadcom-specific API used only on Videocore 4 systems.


拍照

raspistill -o share/cloud/1.jpg

最简单的拍照命令,-o指定了保存的路径,通过--help可以查看支持的所有参数。常用的主要是指定图片质量、宽高,还有一些高级属性,比如白平衡、对焦方式、测逛模式、曝光补偿、光圈快门、ISO, 还支持一些效果。 具体参数可以参见: https://www.raspberrypi.org/documentation/raspbian/applications/camera.md

拍摄的效果射这样的(压缩过了), 16块的摄像头还行吧,白天效果好一些。


摄像

对我来说,主要关注的是摄像,因为主要用来监控,使用raspivid命令进行录像,参数和拍照差不多。可以指定一些视频参数,比如比特率、fps、拍摄时间等等。

raspivid -w 800 -h 480 -b 4000000 -o 1.h264 -fps 24 -t 500

上面录制了一个时长5秒,分辨率是800*480 24FPS的视频。


视频编码和封装

录制的视频是H264编码格式,很多播放器不能直接播放,所以我们把它封装成MP4文件。

sudo apt-get install gpac

先安装一下gpac,使用其中的MP4Box对视频进行封装

➜  ~ MP4Box -add share/cloud/2.h264 share/cloud/2.mp4
AVC-H264 import - frame size 800 x 480 at 25.000 FPS
AVC Import results: 145 samples - Slices: 3 I 142 P 0 B - 0 SEI - 3 IDR
Saving to share/cloud/2.mp4: 0.500 secs Interleaving

对于MP3,MP4,MPEG4,H264,mkv等等很多人都是完全弄不清。其实主要要搞清楚两个概念,编码格式和封装格式。

类型 格式
视频编码 VC-1, MPEG-2, MPEG-4, H.264, H.265, Xvid,WMV
音频编码 AAC, MP3, WMA,WVA,OGG,APE,FLAC
封装格式 MP4,RMVB,TS,FLV,AVI,MKV,3GP

https://blog.csdn.net/qq_41498261/article/details/84205505

一个视频文件可以包含视频、音频,字幕或一些附加信息。而视频和音频都是以某种编码格式进行的编码。而封装就是把音频、视频、字幕等信息打包到一个文件中。

封装格式 音视频组合
MP4 H264 + AAC
MP4 Xvid + MP3
AVI Xvid + MP3
AVI Divx + MP3
MKV Xvid + MP3
MKV H264 + AAC

同一种封装,也可以有不同的音视频的编码格式。而文件后缀名一般就是根据封装格式来定的。对应到我们刚才录制的视频,视频编码格式是H264 ,因为我们没有录制声音,所以没有音频文件。使用MP4Box封装成了mp4文件。


五 局域网监控

摄像头可以正常工作之后,试一下监控。所谓监控其实也就是录像,只不过不是把录像存放到文件。

--output,    -o        Output filename <filename>

Specify the output filename. If not specified, no file is saved. If the filename is ‘-‘, then all output is sent to stdout.

看一下raspivid -o命令, 如果文件名是- 视频会输出到标准输出。在linux上可以方便的利用管道把视频流作为输出传递给其他程序或网络上。


VLC

我们使用VLC播放器把视频流封装后发送到指定的端口

sudo apt-get install vlc

 sudo raspivid -o - -t 0 -w 640 -h 360 -fps 25 | cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264

先在树莓派上安装vlc软件,然后使用raspivid 录制视频并通过管道输出给vlc程序。 cvlc(Console VLC)程序从标准输入读取视频流,vlc不但可以播放视频,还可以同时把视频保存或者输出到其他地方,这里--sout就表示串流输出, 以ts封装格式输出到本机8090端口,输出类型是http。vlc支持多种输出类型和封装格式, 具体参数可以查询wiki:https://wiki.videolan.org/Documentation

命令行的功能上应该和桌面版的VLC一样,我试了下可以在命令行播放视频。我在电脑上安装VLC播放软件,并指定地址http://10.0.0.2:8090播放。

这样就可以在局域网试试监控了,但是用起来延迟比较严重。稍微也有一些卡顿。

sudo raspivid -o - -t 0 -w 640 -h 360 -fps 25|cvlc -vvv stream:///dev/stdin --sout '#standard{access=udp,mux=ts,dst=10.0.0.8:12080}' :demux=h264

然后我使用udp方式,把ts封装的视频发送到我的MAC电脑的12080端口,然后在MAC上使用VLC播放udp://@:12080 , 感觉延迟稍微好一点,但还是很验严重。


SOCAT

除了使用vlc,还可以使用socat 发送到其他设备上。

apt-get install socat
sudo raspivid -o - -t 0 -w 640 -h 360 -fps 25 | socat - udp-datagram:10.0.0.8:12080

我这里以UDP方式把原始的流发送到我MAC上,在MAC上使用VLC 打开udp://@:12080,显示状态在播放,但是播放窗口没有出现。


NC

可以使用 nc 命令来传递原始的数据传输到其他机器。在MAC上执行下面命令,监听12080端口,并把数据发送给mplayer,这里要指定fps和cache, mplayer会从标准输入读取数据

nc -l 12080 | mplayer -fps 25 -cache 1024 -

然后从树莓派发送数据

sudo raspivid -o - -t 0 -w 640 -h 360 -fps 25 | nc 10.0.0.8 12080

mplayer可以显示监控画面,但是延迟同样非常严重。

感觉延迟可能和传输方式关系不大,可能是树莓派性能或者raspivid程序的原因。


六 总结

至此利用树莓派可以搭建一个简单的家庭监控,利用树莓派的raspivid程序来采集视频,使用cvlc等程序来串流,把裸流或者转换过的视频流发送到本机或指定机器,局域网其他机器使用播放器从对应地址拉流,解析播放。

但是目前只能在局域网只查看,如果我上班了,就无法看到家里的情况了。当然可以利用服务器做一个内网映射,但是总是不太好。所以下一篇主要介绍一下自己搭建一个流媒体服务器,在公司通过公网查看家里的监控。


如果本文对您有帮助,可以扫描下方二维码打赏!您的支持是我的动力!
微信打赏 支付宝打赏

2 评论

  1. 请问你的摄像头(OV5647)在淘宝哪个店铺买的,我搜索了一下,基本上都是四五十的。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注