树莓派4B+Pi Camera V3无法捕获帧,RTSP推流报错求助
树莓派4B搭配Pi Camera V3搭建RTSP流服务器失败的解决方法
环境与操作背景
使用Raspberry Pi 4 Model B + Pi Camera Module v3,尝试基于zephyr RTSP库搭建RTSP流服务器,运行以下Python脚本:
import cv2 from zephyr import Stream if __name__ == "__main__": stream = Stream( url="rtsp://localhost:8554/test", resolution=(1280, 720), fps=30, bitrate="2M" ) cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() stream.send(frame)
错误信息
运行后抛出OpenCV断言错误:
Traceback (most recent call last): File "/home/pi/testserver1.py", line 15, in <module> stream.send(frame) File "/home/pi/innov/venv/lib/python3.11/site-packages/zephyr/stream/stream.py", line 174, in send frame = cv2.resize(frame, self.resolution) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cv2.error: OpenCV(4.8.1) /io/opencv/modules/imgproc/src/resize.cpp:4062: error: (-215:Assertion failed) !ssize.empty() in function 'resize'
摄像头检测状态
摄像头可被正常识别:
(venv) pi@YassinePi:~ $ libcamera-still --list-cameras Available cameras ----------------- 0 : imx708 [4608x2592 10-bit RGGB] (/base/soc/i2c0mux/i2c@1/imx708@1a) Modes: 'SRGGB10_CSI2P' : 1536x864 [120.13 fps - (768, 432)/3072x1728 crop] 2304x1296 [56.03 fps - (0, 0)/4608x2592 crop] 4608x2592 [14.35 fps - (0, 0)/4608x2592 crop]
已尝试无效操作
- 更换摄像头索引为1、-1、2
- 重装系统及所有依赖
问题根源
错误!ssize.empty()表明cv2.VideoCapture(0)未能成功读取到摄像头帧,核心原因是Pi Camera V3采用libcamera驱动栈,而传统OpenCV的VideoCapture接口默认使用旧版V4L2驱动栈,二者不兼容。
解决方法
方法1:用Picamera2替代OpenCV读取帧
Picamera2是树莓派官方适配libcamera的Python库,可直接获取摄像头帧并传给zephyr流:
from picamera2 import Picamera2 import cv2 from zephyr import Stream if __name__ == "__main__": stream = Stream( url="rtsp://localhost:8554/test", resolution=(1280, 720), fps=30, bitrate="2M" ) # 初始化Picamera2并配置参数 picam2 = Picamera2() config = picam2.create_video_configuration( main={"size": (1280, 720), "format": "RGB888"} ) picam2.configure(config) picam2.start() while True: # 获取帧并转换为OpenCV兼容的BGR格式 frame = picam2.capture_array() frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) stream.send(frame)
安装依赖:pip install picamera2 opencv-python
方法2:启用传统摄像头驱动栈(不推荐)
通过raspi-config切换到旧版V4L2驱动,让OpenCV可以直接调用摄像头:
- 运行
sudo raspi-config - 进入
Interface Options→Legacy Camera - 选择启用,重启系统
之后原脚本的cv2.VideoCapture(0)即可正常工作,但会损失libcamera带来的性能和功能优势。
替代方案:用原生工具推流(更稳定)
放弃Python库,直接用libcamera-vid和ffmpeg配合RTSP服务器推流,稳定性更高:
- 安装依赖:
sudo apt update && sudo apt install ffmpeg libcamera-tools - 部署RTSP服务器(以轻量的rtsp-simple-server为例):
- 下载对应树莓派的二进制包,解压后运行
./rtsp-simple-server(后台运行可加&)
- 下载对应树莓派的二进制包,解压后运行
- 执行推流命令:
libcamera-vid -t 0 --width 1280 --height 720 --framerate 30 --codec h264 --bitrate 2000000 -n -o - | ffmpeg -i - -vcodec copy -f rtsp rtsp://localhost:8554/test
客户端可通过rtsp://<树莓派IP>:8554/test访问流。
内容的提问来源于stack exchange,提问作者Yassine Benkhalouk
相关产品推荐
相关产品推荐

