系列文章目录
树莓派5-学习笔记1:系统的烧录与安装
树莓派5-学习笔记2:配置VNC远程桌面
树莓派5-学习笔记3:系统更新与备份
树莓派5-学习笔记4:摄像模块安装、调试与网络摄像头的测试(imx219非原厂)
树莓派5-学习笔记5:树莓派+群辉NAS搭建个人监控中心
树莓派5-学习笔记4:摄像模块安装、调试与网络摄像头的测试(imx219非原厂)
前言
这篇文章来来回回写了得有好几天,主要是在摄像头推流调试的时候遇到了奇怪的问题,搞了好久。现在算是搞定了,赶快发出来,这次干货不少,应该会对一些人有用吧。
1. imx219摄像模块安装
价格网上几十块钱随便就能买到,很便宜。原装的会上百,个人感觉没必要,能省则省,主要是为了学习练手的话,随便淘一个就行了。
1)imx219摄像模块外观
模块采用一根柔性扁平电缆(FFC) 连接摄像头模块和树莓派主板(注意尽量不要对折,坏了也不怕,网上包邮几块钱一个,就是耽误时间),摄像头连接22针脚的(大头),树莓派连接15针脚(小头)。
2)树莓派5的DISP接口位置
树莓派5的有两个DISP接口,分别是1和0,位置如下图所示,就在网口左边。
3)imx219摄像模块的安装
首先需要断电操作!!
然后DISP接口黑色挡板是可以向上撬开的,稍微用镊子或者指甲撬一下就行了。
将FFC小的那端插进去,注意线缆黑色面和接口的黑色挡板是在一面的,然后要送到底,轻压挡板,卡主线缆就行了。
imx219安装视频:
树莓派5 imx219摄像头安装
装完后检查一下是否平整。
摄像头安装完成后,就可以重新上电进行调试了。
2. 调试摄像头。
1)使用libcamera-hello 或 rpicam-hello 调试
rpicam本身就是libcamera的换了个名字,树莓派Bookworm版本开始使用rpicam替代libcamera了。
命令行输入libcamera-hello,看一下有没有反应。
libcamera-hello
果然!发现返回错误,提示没有找到摄像头
2)修改/boot/firmware/config.txt 文件
sudo nano /boot/firmware/config.txt
在最后[all]的下面回车加入
[all]
dtoverlay=imx219,cam0
imx219指的是芯片型号,cam0对应的就是刚才安装摄像头的那个接口位置,板子上也印上了CAM/DISP 0。
而dtoverlay是Device Tree overlay的意思,是设备树覆盖层。设备树是描述硬件配置的数据结构,在Linux内核启动过程中被加载,用于初始化硬件设备。
在[all]下添加这个命令,就是任何时候,在cam0接口初始化imx219这个摄像头。
修改后文件如下图所示:
有的指导材料里介绍需要将 camera_auto_detect=1 需要改成camera_auto_detect=0,关闭自动检测摄像头。但是来回试了好几次,发现这个值即便不修改也不影响。
只要配置了dtoverlay基本上就行了,目前暂时保持这个配置,后面如果出现问题,到时候在看看。
记得Ctrl+O保存,Ctrl+X退出。
3)重启设备后,再试下 libcamera-hello
libcamera-hello
现在可以看到,返回的内容不一样了。但由于现在用的是命令行,我们看不到具体的画面。
4)使用VNC登录,再次尝试
VNC远程登录树莓派,然后打开一个Terminal终端,再次输入libcamera-hello 或者rpicam-hello 命令。
这次我们可以看到摄像头拍摄的画面了。
好现在可以看到视频画面了,算是初步调试成功。可以进入下一步了,做个简单的网络摄像头了。
3. 远程监控能力的调试(实现网络摄像头功能)
1)PC上安装VLC软件
首先我们可以下载一个免费的VLC客户端,直接从官网上下就行,官网连接:https://www.videolan.org/
下载后,直接下一步安装即可。
这两个建议勾掉,反正VLC我一般都是用来做内网测试的,以前经常用这个测组播服务。
这样VLC的客户端就准备好了。(我这里是直接开了ubuntu的虚机并做了网卡桥接。就不需要用这个宿主机测试了,不然老得改防火墙配置很麻烦)
2)树莓派上开始推流(使用picam-vid命令)
在树莓派上执行rpicam-vid -n -t 0 –libav-format mpegts --codec h264 -o "udp://<接收端IP地址>:<监听端口号> " 。
具体命令如下:
rpicam-vid -n -t 0 --libav-format mpegts --codec h264 -o "udp://192.168.31.27:8858"
-n ,(--nopreview)禁用预览窗口,可有效节省系统资源。
-t 0 ,(--timeout 0)表示持续推流。
--libav-format mpegts ,指定使用libav封装格式。(关键,如果不加上的话,默认就是H264的裸流)
--codec h264, 视频编码采用h264
-o,(--output)表示输出的形式,后面可以是文件、也可以是udp、tcp这种网络协议。
-o "udp://<接收端IP地址>:<监听端口号> ", udp://192.168.31.27:8858,就是输出成一个udp流,192.168.31.27是目标接收端的ip地址,8858是目标的监听端口,也是这个udp流的目的端口。
如果是:
-o "/home/ixidor/test.mp4",就是输出成一个test.mp4的文件。
3)(监听端)VLC客户端拉流
点击“媒体”–>“打开网络串流”。
在对话栏中输入“upd://@:8858”,点击“播放”按钮。这个8858就是刚才设置的udp直播流的监控端口。
这样就成功了,画面推过来了。不过图像是倒着的。
这个可以直接在VLC客户端上调整,点击“工具”–>“效果及滤镜”。
按顺序操作:“视频效果”–>“几何”–>勾选“旋转”–>调整“角度”至180°。保存即可。
这里放一下监控效果。
树莓派5-imx219网络监控器-测试视频
4)摄像头直播组播流测试
树莓派上使用picam-vid命令,推送组播流。
rpicam-vid -n -t 0 --libav-format mpegts --codec h264 -o "udp://224.0.0.10:8858"
这里更换成了一个组播地址。
同步在局域网内换一台电脑,用VLC客户端监听这个组播流看一下,这里输入:udp://@224.0.0.10:8858。
验证一下,组播推流成功。
5)TCP拉取直播流测试
树莓派上使用picam-vid命令,监听tcp端口。
在树莓派上执行rpicam-vid -n -t 0 --libav-format mpegts --codec h264 --listen -o "udp://0.0.0.0:<监听端口号> " 。
rpicam-vid -n -t 0 --libav-format mpegts --codec h264 --listen -o "tcp://0.0.0.0:8858"
--listen, 表示监听一个网络连接
tcp://0.0.0.0:8858,表示从任意地址发来的TCP:8858
同步在局域网内换一台电脑,用VLC客户端向树莓派发出TCP请求,这里输入:tcp://@192.168.31.236:8858。
验证一下,客户端与树莓派上建立TCP链接,获取直播流量成功。
注意:这个建立的方式是一次性的,VLC客户端关闭的话,服务端也会跟着关闭。
4. 摄像头调试遇坑总结
怎么说呢,反正真的没想到调个这玩意能遇到这么多问题,最红总结发现全都集中在了 --libav-format mpegts 这个上了参数上了。
rpicam-vid -n -t 0 --libav-format mpegts --codec h264 -o "udp://224.0.0.10:8858"
如果不使用MPEG-TS封装的话,就会有问题,像这样,删掉 --libav-format mpegts,直接使用h264裸流。
rpicam-vid -n -t 0 --codec h264 -o "udp://224.0.0.10:8858"
在VLC客户端上同样拉流的话,就会看到视频流永远卡在了第一帧画面。加上 --libav-format mpegts 就好了,不知道是不是跟VLC客户端有关系。也可能是因为mpeg-ts封装提供了CRC校验和重传能力。回头有时间在研究要下了,这个到现在也没搞清楚是为什么?
总结
就一句话,记得–libav-format mpegts。用rpicam-vid命令推流的话,一定要用mpegts封装。希望对别人有用吧。