学校的项目和毕设都要用到红外,后来买了海康的,感觉大公司支持的应该很好,不愁没法用。但是实际用的时候发现SDK只支持pc,arm只支持安卓开发板,一般的手机都不支持。ISAPI是基于网络的海康私有协议,得签保密协议,企业营业执照什么的,学生很难申请。
用不了SDK也得开发呀,现在只能尝试两种方法,rtsp或uvc。记录一下调试过程。
弄树莓派的时候,不习惯树莓派的系统,安装了最新的Ubuntu。进入系统后发现经常动不动就卡死,以为是内存卡读取速率不够或桌面系统需要显存(就是瞎猜),换了不同的内存卡和U盘都是一样的,但是树莓派的系统就很正常。最后给老师打电话老师也不确定是什么情况,但是老师说安装了新的系统都要sudo apt update、sudo apt upgrade一下。于是试了一下,还真的好了。(这一步就折腾了两三天)
rtsp需要插网线,发现直接插路由器就可以直接在pc访问,会弹出potplayer打开。但是买了个USB网卡插到主机上就用不了,找教程改ip关防火墙也没用。只能先插在路由器上用了。
URL规定:
rtsp://username:password@[address]:[port]/Streaming/Channels/[id](?parm1=value1&parm2-=value2…)
注:VLC可以支持解析URL里的用户名密码,实际发给设备的RTSP请求不支持带用户名密码。
举例说明:
通道01主码流:
rtsp://admin:abc12345@172.6.22.234:554/Streaming/Channels/101?transportmode=unicast
通道01子码流:
rtsp://admin:abc12345@172.6.22.234:554/Streaming/Channels/102?transportmode=unicast(单播)
rtsp://admin:abc12345@172.6.22.106:554/Streaming/Channels/102?transportmode=multicast (多播)
rtsp://admin:abc12345@172.6.22.106:554/Streaming/Channels/102 (?后面可省略,默认单播)
通道01第3码流:
rtsp://admin:abc12345@172.6.22.234:554/Streaming/Channels/103?transportmode=unicast
零通道主码流(零通道无子码流):
rtsp://admin:12345@172.6.22.106:554/Streaming/Channels/001
注:新版本URL,通道号全部按顺序从1开始。
想在Linux用同样的方法打开,我用的是树莓派4B,安装了Ubuntu。不知道为啥,打不开浏览器,点一下一直转圈圈,没反应。想卸载也找不到,尝试安装别的浏览器还是打不开。后来死马当活马医sudo apt install firefox,发现能用了,不知道为啥明明有图标,但是打不开,需要在安装一下。因为有一次手贱,sudo chmod 777 /usr,都不能用sudo了,重装了系统,但是再sudo apt install firefox还是打不开,突然发现在终端输入网址再右键在浏览器打开可以直接打开浏览器。
好不容易打开了浏览器,输入URL,弹出VLC,无法打开,不知道什么原因。
联系海康的技术客服,让分别在Linux和windows抓包看一下。
这技术客服就是把rtsp部分筛选出来,说不是正常的rtsp交互。(要是正常的就打开了,我还用问吗 ̄へ ̄)
网上查了很多Linux打开rtsp的教程,大概是FFmpeg,OpenCV这两种。
搭建OpenCV也费了挺多功夫,整了一整个下午才弄好。网上找的程序不能直接g++,返回错误大概是找不到库,gcc -I指定目录也不行。在/usr/找到了/opencv4/opencv2,把opencv2移到和opencv4一个目录就能编译代码了。但是还报了些错,应该是函数用法的问题,学习一下再改进。
代码参考:https://blog.csdn.net/photonfly/article/details/73373545
安装FFmpeg直接sudo apt install ffmepg就可以,我找的教程都得config、make、make install,因为这个也卡了很久,其实没必要,依赖都能在/usr找到。安装好FFmpeg,输入命令
sudo ffmpeg -i rtsp://admin:h123456789@192.168.31.22:554/Streaming/Channels/101 -vcodec copy -acodec copy -c copy -map 0 -f segment -segment_time 30 -segment_format mp4 /home/pi/rtspvideo/output_Video%03d.mp4
即可得到视频。
说明:
利用FFmpeg命令行获取rtsp视频流并将获取的视频,以截取陈30s左右的mp4格式的小视频。
-i:是你输入的rtsp的视频流
-vcodec copy -acodec copy:指尽可能的保存原始视频的音频视频格式。
segment -segment_time:指定截取的视频长度。
想要实时预览rtsp流没找到合适的软件,也可以找qt程序,但是比较麻烦,需要时再弄吧。
rtsp的话还得接网口,线比较多,占地方,不够方便(打算把树莓派装到无人机上),所以打算调试一下,通过uvc协议打开视频。
检测是否找到设备
检查端口
可以检测到摄像头,打不开应该不是缺驱动
用Ubuntu自带的cheese打不开,cheese /dev/video1,cheese /dev/video2,都不行。
FFmpeg也不行,sudo ffmpeg -i /dev/video0 -vframes 1 -s 640x480 -q:v 2 -f image2 /tmp/image6-vdieo0-test1.jpg
Ubuntu不能直接apt install camorama、gstreamer,先不测试。
树莓派自带摄像头,我想用打开树莓派自带摄像头的方法打开红外摄像头。
系统是Ubuntu,需要sudo apt install raspi-config,然后sudo raspi-config,
出现错误:Your firmwave appears to be out of date (no start_x.elf). Please update
解决方法:
查看boot分区所在的设备号,设备号可能是:/dev/mmcblk0p1
df -h
将该设备号挂载在/boot上
mount /dev/mmcblk0p1 /boot
随后会出现是否设置为enabled,选择yes。
等待树莓派重启。
重启后插上csi摄像头检查是否有摄像头设备
树莓派摄像头可以用motion实时预览图像
sudo apt-get install motion
首先将motion软件的后台进程改为开启,让它能够一直在后台运行。输入以下命令,将文件中 “start_motion_daemon=no” 的no改为yes。
sudo nano /etc/default/motion
之后输入命令打开motion的配置文件:
sudo nano /etc/motion/motion.conf
这个文件中保存了许多motion的基本设置。因为选项比较多,下面只写出一些比较重要的选项的值,其他可以用默认值,或者参考motion官网上的documents,那里面写得很详尽,每个参数的解释都有。motion.conf里自带的注释也很完整。
需要更改的参数有以下几行,在nano编辑器环境下可以使用快捷键ctrl+w对关键字进行查找。
daemon on #off改成on
width 640
height 480 #根据摄像头像素自行更改
framerate 50 #帧率
stream_maxrate 200
stream_localhost off #设为off
当然要想获得最佳的效果,文档中的参数需要多次根据自己的设备进行相应的调整。
修改完成后保存并退出。
若你之前打开过motion,那么在每次更改完配置后,需要先关闭motion进程,并再次打开,相当于对motion进行一次重启。关闭motion服务的命令如下:
sudo killall -TERM motion
接着输入命令重新打开motion:
sudo motion
打开后便可以通过在浏览器内访问地址http://树莓派IP:8080,看到相应的监控画面了。
用同样的方法打开/dev/video1和/dev/video2,是灰屏或者蓝屏。可能是编码的问题。
sudo apt-cache search uvcview
sudo v4l2-ctl -d /dev/video1 --list-formats-ext
uvc比rtsp延迟低多了,接下来就是写个opencv代码,设置成开机运行,把图像保存下来,再画几块碳纤维板固定到飞机上就行了。
Ubuntu弄了好久,就是不行,报错让我感觉是系统的问题,气不过连夜重新弄了树莓派系统,就行了,绝了。