Blog:
在 iMX8 上使用 MIPI-CSI 摄像头

Thursday, March 18, 2021

NXP i.MX8QM/QP 处理器能够支持 2 路 4 lane 的 MIPI CSI-2 输入,每路最高为 4K@30 分辨率。文章接下来将使用 Apalis iMX8QM 计算机模块配合 e-con 提供的 MIPI CSI-2 摄像头 AR0521 进行演示。

E-con MIPI CSI-2 摄像头 AR0521 最高像素 2592 × 1944@28fps,模组集成 ISP。摄像头可以直接连接 Ixora 底板,连接方式如下。线材的卡扣很精密,安装时请小心操作。同时接触摄像头模组前,务必释放上手的静电,如触摸接地设备的金属机壳。

 

Apalis iMX8QM 的 Linux BSP 对摄像头提供无缝集成,只需简单的设置即可使用。这里我们使用 Toradex 最新的 nightly image。由于摄像头需要使用 gstreamer 组件,tdx-reference-multimedia-image 参考镜像包含了常用多媒体软件,该镜像可以直接用于测试摄像头。使用 Toradex Easy Installer 进行镜像安装。

安装完毕后修改计算机模块上的  /boot/overlays.txt 文件,通过 device tree overlay 启动 AR0521。在 overlays.txt 中添加 apalis-imx8_ar0521_overlay.dtbo。

root@apalis-imx8:~# cat /boot/overlays.txt 
fdt_overlays=apalis-imx8_hdmi_overlay.dtbo apalis-imx8_ar0521_overlay.dtbo

关闭 tdx-reference-multimedia-image 开机自启动的 Qt 演示程序。

root@apalis-imx8:~#  systemctl stop wayland-app-launch.service
root@apalis-imx8:~# sync
root@apalis-imx8:~# reboot

重启后可以看到 AR0521 被正确识别。

root@apalis-imx8:~# dmesg|grep ar0
[    3.654557] ar0521 5-0042: Current Firmware Version - (1150CU96RKV1901110d381894XXXXXXX)
[    8.709560] mx8-img-md: Registered sensor subdevice: ar0521 5-0042 (1)
[    8.729187] mx8-img-md: created link [ar0521 5-0042] => [mxc-mipi-csi2.1] 

  • 查看摄像头支持的格式

root@apalis-imx8:~# v4l2-ctl --device=/dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
      Type: Video Capture Multiplanar

      [0]: 'UYVY' (UYVY 4:2:2)
              Size: Discrete 640x480
                      Interval: Discrete 0.013s (75.000 fps)
              Size: Discrete 1280x720
                      Interval: Discrete 0.010s (100.000 fps)
              Size: Discrete 1280x960
                      Interval: Discrete 0.013s (75.000 fps)
              Size: Discrete 1920x1080
                      Interval: Discrete 0.015s (65.000 fps)
              Size: Discrete 2560x1440
                      Interval: Discrete 0.026s (38.000 fps)
              Size: Discrete 2592x1944
                      Interval: Discrete 0.036s (28.000 fps)
      [1]: 'RGBP' (16-bit RGB 5-6-5)
      [2]: 'RGB3' (24-bit RGB 8-8-8)
      [3]: 'BGR3' (24-bit BGR 8-8-8)
      [4]: 'YUYV' (YUYV 4:2:2)
      [5]: 'YUV4' (32-bit A/XYUV 8-8-8-8)
      [6]: 'NV12' (Y/CbCr 4:2:0)
      [7]: 'YM24' (Planar YUV 4:4:4 (N-C))
      [8]: 'XR24' (32-bit BGRX 8-8-8-8)
      [9]: 'AR24' (32-bit BGRA 8-8-8-8)

  • 预览摄像头画面

root@apalis-imx8:~# gst-launch-1.0 v4l2src device='/dev/video0' ! video/x-raw,format=RGB16,width=1920,height=1080,framerate=30/1 ! waylandsink -v

此时可能需要旋转摄像头上镜头进行对焦,直到清晰地看到拍摄物体。

 

  • 录制摄像

root@apalis-imx8:~#  gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=300 ! \
'video/x-raw,format=(string)NV12,width=1920,height=1080,framerate=(fraction)30/1' \

! queue ! v4l2h264enc ! avimux ! filesink location=test.avi

可以将 test.avi 视频文件复制到电脑上,使用 mediainfo 命令查看该文件的视频信息。

Gstreamer pipeline 还可以支持 zero-copy 方式处理数据。借助 zero-copy CPU 能够使用一个 element 产生的数据而无需重新复制,从而有效降低 CPU 负荷。使用 io-mode 参数开启 zero-copy,io-mode=dmabuf 会使用硬件 DMA。更多的说明请参考 i.MX 8 GStreamer User Guide

root@apalis-imx8:~#  gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=300 io-mode=dmabuf ! \
'video/x-raw,format=(string)NV12,width=1920,height=1080,framerate=(fraction)30/1' ! queue ! \
v4l2h264enc output-io-mode=dmabuf-import ! avimux ! filesink location=test1.avi 

两种模式下 CPU 占用率从 101.7% 下降到 10.6%。

 

  • 播放视频文件

播放上面录制的 avi 视频文件

root@apalis-imx8:~#  gst-launch-1.0 filesrc location=test.avi ! \
h264parse ! v4l2h264dec ! imxvideoconvert_g2d ! queue ! waylandsink 

  • RTP 网络传输

Apalis iMX8QM 作为 RTP 服务器

root@apalis-imx8:~#  gst-launch-1.0 -v v4l2src device=/dev/video0 ! \
'video/x-raw,format=(string)NV12,width=1920,height=1080,framerate=(fraction)30/1' ! \
v4l2h264enc ! rtph264pay ! udpsink host=PC_IP

Ubuntu 电脑作为客户端查看视频。上面的 PC_IP 为电脑的 IP 地址。

$  gst-launch-1.0 udpsrc caps='application/x-rtp,media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96' ! \
rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink

 

总结

本文简要地介绍了在 Apalis iMX8QM 使用 MIPI-CSI 摄像头的方法。不同的摄像头通常需要对应的驱动,并根据摄像头参数调整 gstreamer pipeline 配置,从而实现高效的采集、编解码、传输和存储。

Author: 胡珊逢,FAE,韬睿(上海)
Share this on:

Leave a comment

Your email ID will be kept confidential. Required fields are marked *



* Your comment will be reviewed and then added. Thank you.

Related Blog

Latest Blog

Tuesday, May 11, 2021
Importing a Qt Project Into Torizon Using VS Code
Monday, April 26, 2021
Using a VPN on embedded Linux systems
Tuesday, March 23, 2021
Running Qt without a GPU
Have a Question?