聊聊树莓派RaspiCam,libcamera,rpicam套件区别,及CSI/USB Camera推流


背景:最近想玩下树莓派视频推流,翻出了尘封的树莓派4B和CSI接口摄像头,因为后续想玩下ROS2,ROS2对Ubuntu支持较好,所以装了个Ubuntu22.04。然后折腾了2天…为了让后来的小伙伴少走弯路,这里简单记录下,供大伙参考。

日期:2024.03.22
测试环境:树莓派4B + Ubuntu22.04 Desktop 64bit
CSI接口摄像头,USB Camera

目标是使用mjpg_streamer来实现CSI/USB Camera视频推流。
在这里插入图片描述

1. 树莓派平台Camera工具套件变更历史

RaspiCam:
工具是树莓派初始发布时就随摄像头模块一起引入的,大约是在2013年左右发布的。包含raspistill, raspivid and raspistillyuv等命令行工具应用。python API:picamera。

Ubuntu如果要移植这套工具,需要编译安装userland。但是userland只支持32bit系统,默认的脚本是编译32bit工具的,编译会报错,要想编译64位工具,需要按以下方式编译。(不要急着去走这条路,我没走通,先看下文。)

#Install rpi-update
sudo curl -L --output /usr/bin/rpi-update https://raw.githubusercontent.com/Hexxeh/rpi-update/master/rpi-update && sudo chmod +x /usr/bin/rpi-update
sudo rpi-update

#Install userland
git clone https://github.com/raspberrypi/userland.git
cd userland
sed -i 's/__bitwise/FDT_BITWISE/' opensrc/helpers/libfdt/libfdt_env.h
sed -i 's/__force/FDT_FORCE/'  opensrc/helpers/libfdt/libfdt_env.h
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DARM64=ON ../
sudo make -j4 &&sudo make install

基于这套旧的架构,mjpg_streamer 需要加载input_raspicam.so, 这个so编译依赖userland编译后生成的opt/vc目录里的相关库,但是成功编译64bit userland后,编译input_raspicam.so也还会报错,具体报错没留记录。总之,userland没法良好支持64bit系统,包括树莓派自身的系统。最新的树莓派系统也只有32bit能用这套架构,64位已经没有raspistill, raspivid and raspistillyuv相关工具,取而代之的是rpicam。 所以可以直接跳到下一节了,废弃的东西就不要留恋了。

./mjpg_streamer -o "output_http.so -w ./www" -i "input_raspicam.so"

查看mjpg-streamer\mjpg-streamer-experimental\plugins\input_raspicam\CMakeLists.txt可以看到依赖关系。

if (EXISTS /opt/vc/include) #需要opt/vc/include目录存在才会去编译raspicam相关库,编译userland会生成opt/vc会生成相关工具和库
set(HAS_RASPI ON) else()
set(HAS_RASPI OFF) endif()

MJPG_STREAMER_PLUGIN_OPTION(input_raspicam “Raspberry Pi input camera plugin”
ONLYIF HAS_RASPI) if (PLUGIN_INPUT_RASPICAM)
include_directories(/opt/vc/include)
include_directories(/opt/vc/include/interface/vcos)
include_directories(/opt/vc/include/interface/vcos/pthreads)
include_directories(/opt/vc/include/interface/vmcs_host)
include_directories(/opt/vc/include/interface/vmcs_host/linux)
link_directories(/opt/vc/lib)
MJPG_STREAMER_PLUGIN_COMPILE(input_raspicam input_raspicam.c)
target_link_libraries(input_raspicam mmal_core mmal_util mmal_vc_client vcos bcm_host)

endif()

libcamera:
根据树莓派基金会的官方公告,他们计划在2021年初开始逐步引入libcamera,并将其作为默认的摄像头堆栈。原因是RaspiCam做的稀烂。

libcamera-apps套件包含以下工具:
包含libcamera-hello: 输出从相机中获取的预览图像功能
libcamera-jpeg: 通过相机获取高分辨率的JPEG图像
libcamera-still: 一个功能类似于raspistill的相机视频获取程序
libcamera-vid: 视频捕获程序
libcamera-raw: 直接从相机中获取未压缩的原始RAW图像程序
libcamera-detect: 这个程序默认是不编译的,如果用户在树莓派上安装了TensorFlow Lite软件则可以
使用此程序进行目标检测图像捕获。

rpicam:
2023年11月份官方公告libcamera-apps更名为rpicam-apps,官方解释是用户容易将libcamera-apps和libcamera核心库的开发组织混淆,经常有用户把libcamera-apps问题提交给libcamera组织,真是无妄之灾。python API: Picamera2

libcamera-apps和rpicam-apps套件中应用和库对应关系,好像辨认。
applications:libcamera-still -> rpicam-still, libcamera-vid - > rpicam-vid, etc.
the library file: libcamera_app.so -> rpicam_app.so
deb packages : e.g. libcamera-apps -> rpicam-apps

介绍完以上内容,面对网上早期或者近期的文档中各种不同的描述,就能知道自己想要什么了,当然注意我这个文章的撰写日期,时间久了也不一定适用未来的发展,可能会给大家造成新的困惑,所以注意甄别。接下来我们死磕rpicam就好了。

2. 识别Camera(适用CSI和USB Camera)

修改/boot/firmware/config.txt,检查两处修改

Raspberry Pi Imager安装最新的Ubuntu22.04,config.txt从、boot/config.txt变成了/boot/firmware/config.txt

第1处:
检查gpu_mem,start_x是否如以下配置(其实不需要改,默认就已打开,只需要检查确认下)

gpu_mem=128
start_x=1

第2处是:
网上资料通常是说将camera_auto_detect=1此句注释掉

#camera_auto_detect=1

使用sudo vcgencmd get_camera查看Camera模块是否识别

supported=1 detected=1, libcamera interfaces=0

使用fswebcam测试是否能生成图片

sudo fswebcam --no-banner -r 640x480 test.jpg 

这里提醒下,camera_auto_detect=1注释掉或者设置为0,sudo vcgencmd get_camera结果
supported=1 detected=1, libcamera interfaces=0
如果是保持camera_auto_detect=1,sudo vcgencmd get_camera结果
supported=1 detected=0, libcamera interfaces=1
暂且先将camera_auto_detect=1注释掉,后面看下影响。

vcgencmd 是一个在树莓派上执行命令的实用程序,用于与 Broadcom VideoCore GPU 进行通信。VideoCore GPU 是树莓派中的图形处理单元,而 vcgencmd 允许用户从命令行界面获取有关 GPU 和系统状态的信息。
以下是 vcgencmd 可以执行的一些常见操作:
获取系统信息:vcgencmd get_mem arm 可以获取 ARM 内存的使用情况,vcgencmd get_mem gpu 可以获取 GPU 内存的使用情况。
获取温度信息:vcgencmd measure_temp 可以获取 CPU 温度。
获取时钟频率:vcgencmd measure_clock arm 可以获取 ARM 的时钟频率,vcgencmd measure_clock core 可以获取 GPU 核心的时钟频率等。
控制电源管理:vcgencmd display_power 可以开启或关闭显示器电源。
检查电池状态:vcgencmd get_throttled 可以检查 CPU 是否过热或电源供应是否稳定。
配置摄像头:vcgencmd get_camera 检查树莓派的摄像头模块是否可用。
fswebcam 是一个在 Linux 系统上使用命令行进行简单摄像头操作的工具。它允许用户通过命令行捕获图像,并将其保存为文件。主要作用包括:
捕获图像:fswebcam 可以从连接到 Linux 系统的摄像头中捕获图像。
保存图像:捕获的图像可以保存为 JPEG、PNG 或其他常见格式的图像文件。
调整参数:fswebcam 允许用户通过命令行选项设置一些参数,如分辨率、亮度、对比度等。
自动化:由于可以从命令行调用,因此 fswebcam 可以集成到脚本或自动化任务中,用于定期捕获图像、监控、时间戳图像等应用。

3. CSI Camera推流

下一步,安装libcamera核心库与树莓派rpicam-apps来实现CSI Camera推流。

安装meson自动化构建工具
树莓派Ubuntu22.04默认meson版本(sudo apt install meson)是0.61.2,后面编译rpicam-apps要求版本大于0.64.0,所以这里我们手动配置下。其他工具apt install正常安装即可。

#when build rpicam we will encounter,so we install it : “ERROR: Meson version is 0.61.2 but project requires >= 0.64.0”

git clone https://github.com/mesonbuild/meson.git
sudo ln -s meson/meson.py /usr/bin/meson

编译libcamera

#build libcamera
sudo apt install -y python3-pip git python3-jinja2
sudo apt install -y libboost-dev
sudo apt install -y libgnutls28-dev openssl libtiff5-dev pybind11-dev
sudo apt install -y qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5
sudo apt install -y cmake
sudo apt install -y python3-yaml python3-ply
sudo apt install -y libglib2.0-dev libgstreamer-plugins-base1.0-dev
git clone https://github.com/raspberrypi/libcamera.git
cd libcamera
meson setup build --buildtype=release -Dpipelines=rpi/vc4,rpi/pisp -Dipas=rpi/vc4,rpi/pisp -Dv4l2=true -Dgstreamer=enabled -Dtest=false -Dlc-compliance=disabled -Dcam=disabled -Dqcam=disabled -Ddocumentation=disabled -Dpycamera=enabled
ninja -C build
sudo ninja -C build install
cd ..

编译rpicam-apps

#build rpicam-apps
sudo apt install -y libcamera-dev libepoxy-dev libjpeg-dev libtiff5-dev libpng-dev
sudo apt install -y qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5
sudo apt install libavcodec-dev libavdevice-dev libavformat-dev libswresample-dev
sudo apt install -y cmake libboost-program-options-dev libdrm-dev libexif-dev

git clone https://github.com/raspberrypi/rpicam-apps.git
cd rpicam-apps/
meson setup build -Denable_libav=true -Denable_drm=true -Denable_egl=true -Denable_qt=true -Denable_opencv=false -Denable_tflite=false
meson compile -C build
sudo meson install -C build
cd ..

编译完成后,使用rpicam-vid测试下视频预览

sudo rpicam-vid -t 10000 -o test.h264

报错,提示找不到camera,这个时候回到前面说的

camera_auto_detect=1注释掉或者设置为0,sudo vcgencmd get_camera结果
supported=1 detected=1, libcamera interfaces=0
如果是保持camera_auto_detect=1,sudo vcgencmd get_camera结果
supported=1 detected=0, libcamera interfaces=1

我们是把camera_auto_detect=1注释掉了,libcamera interfaces=0。 我们把camera_auto_detect=1释放出来,让libcamera interfaces=1,这个时候rpicam-vid就能正常预览了。

rpicam-vid本身可以推流,但是我在执行时遇到runtime error,没有去细究原因,有空再研究。

rpicam-vid -t 0 --inline -o - | cvlc stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/stream1}' :demux=h264

libcamera核心库与树莓派rpicam-apps应用套件安装和使用官网描述很详细。

Raspberry Pi Documentation - Camera software
Raspberry Pi Documentation - Building libcamera and rpicam-apps

编译mjpg-streamer

git clone https://github.com/jacksonliam/mjpg-streamer
sudo apt-get install cmake libjpeg8-dev gcc g++
cd mjpg-streamer-experimental
make
sudo make install

mjpg_streamer 测试

使用mjpg_streamer 推流,注意下camera_auto_detect=1还是得注释掉,让sudo vcgencmd get_camera结果显示以下结果,不然好像也不行,大家可以自己测下,有结果可以和我说说。

supported=1 detected=1, libcamera interfaces=0

服务端:树莓派命令行执行:

sudo mjpg_streamer -i "input_uvc.so -d /dev/video0 -u -f 30" -o "output_http.so -w ./www"

客户端:局域网内PC浏览器执行

<ip>:8080,进入后点击"Stream"

在这里插入图片描述

注意这里服务端,我们加载是input_uvc.so,而不是input_raspicam.so了,所以在rpicam-apps(基于libcamera)架构下,基于mjpg_streamer 推流,CSI camera和USB camera用的同样的命令。

4. USB Camera推流

USB Camera通用很多,没啥困难的,第2节识别Camera后,直接到CSI Camera推流->mjpg_streamer 测试章节即可,应该没啥问题,没重新试过。
有问题可以参考别人的文章,这里不细述了:
https://blog.csdn.net/mjmmm/article/details/136311441

  • 47
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值