MIPI 摄像头-imx477测试
QuecPi Alpha 单板电脑支持 MIPI 接口摄像头,下面选取微雪的一款 imx477 CSI 接口 CMOS 摄像头为例进行测试。
摄像头连接
按照下图进行连接,连接时向上拉开连接器的黑色锁扣部分,将 FPC 排线插入第二个 CSI 卡槽,注意金属接触面朝向板内金属接触面,按下锁扣,确认 FPC 排线稳定没有松动。
前提条件
在 SSH 终端中运行以下命令:
mount -o rw,remount /
export XDG_RUNTIME_DIR=/dev/socket/weston
export WAYLAND_DISPLAY=wayland-1
单摄像头流启动
- 在 device 终端中运行以下命令
gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=1 ! 'video/x-raw(memory:GBM),format=NV12,width=1280,height=720,framerate=30/1' ! fakesink
- 此示例说明如何使用 720p@30 FPS 配置启动摄像头。来自摄像头传感器的帧被 fakesink 丢弃。如果 gst pipeline 状态更改为 “PLAYING”,如下所示,则表示摄像头正在运行。由于此命令会将摄像头帧转储到 fakesink,因此不会在设备上保存任何内容。
gbm_create_device(187): Info: backend name is: msm_drm
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
- 如果想实时显示摄像头捕捉的画面,需提前连接好 HDMI 屏幕,并执行以下命令:
gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=1 ! 'video/x-raw(memory:GBM),format=NV12,width=1280,height=720,framerate=30/1' ! waylandsink
- camera=0 表示使用第一个 CSI 接口摄像头,camera=1 表示使用第二个 CSI 接口摄像头
- 如果想全屏显示,请在命令后面加上
fullscreen=true
- 如果要停止摄像头流,请按下
CTRL+C
预览+视频录制
- 在 device 终端中运行以下命令:
gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=1 video_1::type=preview ! 'video/x-raw,format=NV12,width=1280,height=720,framerate=30/1',compression=ubwc,interlace-mode=progressive,colorimetry=bt601 ! tee name=t ! queue ! waylandsink fullscreen=true t. ! queue ! v4l2h264enc capture-io-mode=5 output-io-mode=5 extra-controls="controls,video_bitrate=6000000,video_bitrate_mode=0;" ! queue ! h264parse ! mp4mux ! filesink location=/opt/mux_avc.mp4
- 此命令以 720p 30 FPS 配置启动相机,并在 h264 视频编码后将其另存为视频文件。如果 gst 管道状态更改为 “PLAYING”,则表示摄像头正在运行。
- 如果要停止摄像头录制,请按下
CTRL+C
- MP4 文件保存在 /opt/ 目录
命令说明:
! 是一个连接符号,用于将前一个元素的输出连接到后一个元素的输入
gst-launch-1.0
这是 GStreamer 的命令行工具,用于启动一个 GStreamer 管道(pipeline)。-e 参数表示在管道结束时退出,而不是继续运行。qtiqmmfsrc name=camsrc camera=1
高通平台专用的摄像头源插件,从设备 camera=1(副摄像头)采集视频。video_1::type=preview
这是 qtiqmmfsrc 元素的属性配置,针对 video_1 流(不同摄像头可能输出多路流,比如预览流、抓拍流等 ),设置其类型为 preview(预览流 ),表示后续处理的是用于实时预览场景的视频流,一般帧率、分辨率等参数会适配预览需求。video/x-raw,format=NV12,width=1280,height=720,framerate=30/1
video/x-raw(原始视频),NV12(YUV 4:2:0,单平面格式,常见于视频编码),分辨率 1280×720(720p),帧率 30fps。compression=ubwc,interlace-mode=progressive,colorimetry=bt601
启用高通的UBWC(Ultra Bandwidth Compression) 技术,通过硬件压缩减少内存带宽需求,逐行扫描(非隔行),色彩空间为 ITU-R BT.601(适用于标清视频)。tee name=t
分流器(tee)元素,作用是将一路输入数据复制成多路输出,方便对同一视频流进行多种不同处理(这里一路用于预览显示,一路用于编码存储 )。 name=t 给这个 tee 元素命名为 t,后续其他分支通过名字引用它来获取视频流 。queue ! waylandsink fullscreen=true
queue:队列元素,用于在 pipeline 中创建一个缓冲队列,起到解耦上下游元素、异步处理的作用。可以缓解上下游处理速度不一致的问题,避免因一方处理慢导致另一方阻塞或丢帧 。
waylandsink:输出 sink 元素,用于在 Wayland 显示服务器环境下,将视频画面渲染显示到屏幕上 。
fullscreen=true:设置 waylandsink 以全屏模式显示视频画面 。
t. ! queue
t.:通过 . 语法引用之前命名为 t 的 tee 元素,获取视频流进行后续处理 。
queue:再次使用队列元素,缓冲数据,保证编码等环节的流畅性 。
v4l2h264enc capture-io-mode=5 output-io-mode=5 extra-controls="controls,video_bitrate=6000000 video_bitrate_mode=0;"
使用 DMABUF(直接内存访问缓冲区)进行输入,优化数据传输效率,同样使用 DMABUF 输出编码后数据,目标比特率为 6 Mbps,使用 CBR(固定比特率) 模式,适合网络流媒体或需要稳定带宽的场景。queue ! h264parse ! mp4mux ! filesink location=/opt/mux_avc.mp4
queue:又一个队列元素,继续缓冲编码后的数据,协调后续处理速度。解析 H.264 流,添加必要的 NAL 单元头部,使其符合 MP4 封装要求,将 H.264 视频流封装为 MP4 格式,将数据写入文件 /opt/mux_avc.mp4。
预览+拍照
- 在 device 终端中运行以下命令:
gst-pipeline-app -e qtiqmmfsrc name=camsrc camera=1 ! 'video/x-raw(memory:GBM),format=NV12,width=1280,height=720,framerate=30/1' ! waylandsink camsrc.image_1 ! "image/jpeg,width=1280,height=720,framerate=30/1" ! multifilesink location=/opt/frame%d.jpg async=false sync=true
- 按
Enter
键。此命令将打印以下菜单并等待用户输入。
##################################### MENU #####################################
============================== Pipeline Controls==============================
(0) NULL: Set the pipeline into NULL state
(1) READY: Set the pipeline into READY state
(2) PAUSED: Set the pipeline into PAUSED state
(3) PLAYING: Set the pipeline into PLAYING state
==================================== Other====================================
(p) Plugin Mode: Choose a plugin which to control
(q) Quit : Exit the application
Choose an option:
- 使用以下菜单步骤在预览时拍摄快照。
(1) ready -> (3) Playing -> (Enter)-> (p)Plugin Mode : Select (5)camerasrc ->(36) capture-image -> (1): still – Snapshot ->(1) Snapshot count ('guint' value for arg1)
- 要停止相机,请按
Enter
,按b
(返回),然后按q
(退出)。拍摄的快照图像保存在 /opt/ 中。通过在主机 PC 上运行以下scp
命令,可以从设备中提取录制的内容:
scp -r root@[ip-addr]:/opt/<file name> .
- 生成文件如下图所示:
双摄像头流拼接显示
从主摄像头和辅助摄像头获取的两个流(均为 720p)。两个流被发送以并排组合,然后显示。
gst-launch-1.0 -e qtivcomposer name=mixer sink_0::position="<0, 0>" sink_0::dimensions="<640, 360>" sink_1::position="<640, 0>" sink_1::dimensions="<640, 360>" mixer. ! queue ! waylandsink enable-last-sample=false fullscreen=true qtiqmmfsrc name=camsrc_0 camera=0 ! video/x-raw\(memory:GBM\), format=NV12, width=1280, height=720, framerate=30/1, compression=ubwc ! mixer. qtiqmmfsrc name=camsrc_1 camera=1 ! video/x-raw\(memory:GBM\), format=NV12, width=1280, height=720, framerate=30/1, compression=ubwc ! mixer.
- 如果要停止摄像头流,请按下
CTRL+C