Skip to main content

3.4.2 参考示例(C++)

本章节介绍多媒体库开发的多种功能示例,包括摄像头图像采集、视频编解码、视频显示、算法推理等功能。

warning

以下Sample需要sudo权限执行。

摄像头图像采集和显示

本示例vio2display示例实现了MIPI摄像头图像采集功能,并通过HDMI接口输出,用户可通过显示器预览画面。

示例流程框图:

image-vio_to_display

  • 环境准备:

    • 开发板断电状态下,将MIPI摄像头接入开发板
    • 通过 HDMI 线缆连接开发板和显示器
    • 开发板上电,并通过命令行登录
  • 运行方式: 示例代码以源码形式提供,需要使用make命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/cdev_demo/vio2display
    sunrise@ubuntu:/app/cdev_demo/vio2display$ make
    sunrise@ubuntu:/app/cdev_demo/vio2display$ ./vio2display -w 1920 -h 1080

    参数说明:

    • -w: sensor 输出宽度
    • -h: sensor 输出高度
  • 预期效果: 程序正确运行后,开发板会通过显示器输出MIPI摄像头采集的实时画面。运行 log 如下:

    sunrise@ubuntu:/app/cdev_demo/vio2display$ ./vio2display -w 1920 -h 1080
    [UCP]: log level = 3
    [UCP]: UCP version = 3.7.3
    [VP]: log level = 3
    [DNN]: log level = 3
    [HPL]: log level = 3
    [UCPT]: log level = 6
    disp_w=1920, disp_h=1080
    2025/06/16 10:12:21.574 !INFO [CamInitParam][0295]set camera fps: -1,width: 1920,height: 1080
    mipi mclk is not configed.
    Searching camera sensor on device: /proc/device-tree/soc/vcon@0 i2c bus: 1 mipi rx phy: 0
    WARN: Sensor Name: ar0820std-30fps, Expected Chip ID: 0xCB34, Actual Chip ID Read: 0x00
    [0] INFO: Found sensor name:imx219-30fps on mipi rx csi 0, i2c addr 0x10, config_file:linear_1920x1080_raw10_30fps_1lane.c
    2025/06/16 10:12:21.575 !INFO [CamInitPymParam][0258]Setting PYM channel:0: crop_x:0, crop_y:0, input_width:1920, input_height:1080, dst_w:1920, dst_h:1080
    [ 110.667129] [E|ISP-2A|main.c+66]: [FW_GENERIC]/sys/class/vps/isp0_src/v3a open fail, err is Permission denied
    [ 110.667169] [E|ISP-2A|main.c+68]: [FW_GENERIC]/sys/class/vps/isp1_src/v3a open fail, err is Permission denied
    sp_open_camera success!
    2025/06/16 10:12:21.727 !INFO [OpenDisplay][0111]Wayland is available, using Wayland for rendering.
    Using default socket path: /run/user/1000/wayland-0
    Press 'q' to Exit !

摄像头图像采集并编码

本示例vio2encoder示例实现了 MIPI 摄像头图像采集功能,并编码后在本地保存,用户可通过显示器预览画面。

示例流程框图:

image-vio_to_encoder

  • 环境准备:

    • 开发板断电状态下,将MIPI摄像头接入开发板
    • 通过 HDMI 线缆连接开发板和显示器
    • 开发板上电,并通过命令行登录
  • 运行方式: 按照以下命令执行程序 示例代码以源码形式提供,需要使用make命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/cdev_demo/vio2encoder
    sunrise@ubuntu:/app/cdev_demo/vio2encoder$ make
    sunrise@ubuntu:/app/cdev_demo/vio2encoder$ ./vio2encoder -w 1920 -h 1080 --iwidth 1920 --iheight 1080 -o stream.h264

    参数说明:

    • -w: 编码视频宽度
    • -h: 编码视频高度
    • --iwidth: sensor 输出宽度
    • --iheight: sensor 输出高度
    • -o: 编码输出路径
  • 预期效果: 程序正确运行后,在当前目录下会生成名为stream.h264的视频文件。运行 log 如下:

    sunrise@ubuntu:/app/cdev_demo/vio2encoder$  ./vio2encoder -w 1920 -h 1080 --iwidth 1920 --iheight 1080 -o stream.h264
    [UCP]: log level = 3
    [UCP]: UCP version = 3.7.3
    [VP]: log level = 3
    [DNN]: log level = 3
    [HPL]: log level = 3
    [UCPT]: log level = 6
    2025/06/16 11:04:37.628 !INFO [CamInitParam][0295]set camera fps: -1,width: 1920,height: 1080

    mipi mclk is not configed.
    Searching camera sensor on device: /proc/device-tree/soc/vcon@0 i2c bus: 1 mipi rx phy: 0
    WARN: Sensor Name: ar0820std-30fps, Expected Chip ID: 0xCB34, Actual Chip ID Read: 0x00
    [0] INFO: Found sensor name:imx219-30fps on mipi rx csi 0, i2c addr 0x10, config_file:linear_1920x1080_raw10_30fps_1lane.c
    2025/06/16 11:04:37.629 !INFO [CamInitPymParam][0258]Setting PYM channel:0: crop_x:0, crop_y:0, input_width:1920, input_height:1080, dst_w:1920, dst_h:1080
    [ 3246.617496] [E|ISP-2A|main.c+66]: [FW_GENERIC]/sys/class/vps/isp0_src/v3a open fail, err is Permission denied

    [ 3246.617538] [E|ISP-2A|main.c+68]: [FW_GENERIC]/sys/class/vps/isp1_src/v3a open fail, err is Permission denied

    sp_open_camera success!
    2025/06/16 11:04:37.770 !INFO [vp_encode_config_param][0408]codec type is h264: frame size:3110912 frame rate: 30
    sp_start_encode success!
    sp_module_bind(vio -> encoder) success!
    ^C
    recv:2,Stoping...

视频文件解码并显示

本示例decoder2display实现了视频文件解码,并通过HDMI接口输出,用户可通过显示器预览画面。

示例流程框图:

image-decoder_to_display

  • 环境准备:

    • 通过 HDMI 线缆连接开发板和显示器
    • 开发板上电,并通过命令行登录
    • 准备视频编码文件 stream.h264 作为输入。
  • 运行方式: 示例代码以源码形式提供,需要使用 make 命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/cdev_demo/decode2display
    sunrise@ubuntu:/app/cdev_demo/decode2display$ make
    sunrise@ubuntu:/app/cdev_demo/decode2display$ ./decoder2display -w 1920 -h 1080 -i /app/pydev_demo/07_decode_rtsp_stream/1080P_test.h264

    参数说明:

    • -h: 视频文件的高度
    • -w: 视频文件的宽度
    • -i: 视频文件的路径
  • 预期效果: 程序正确运行后,视频画面会通过开发板的HDMI接口输出,用户可以通过显示器预览视频画面。运行 log 如下:

    sunrise@ubuntu:/app/cdev_demo/decode2display$ ./decoder2display -w 1920 -h 1080 -i /app/pydev_demo/07_decode_rtsp_stream/1080P_test.h264
    [UCP]: log level = 3
    [UCP]: UCP version = 3.7.3
    [VP]: log level = 3
    [DNN]: log level = 3
    [HPL]: log level = 3
    [UCPT]: log level = 6
    disp_w=1920, disp_h=1080
    sp_start_decode success!
    2025/06/16 10:48:49.220 !WARN [sp_start_display][0049]Warning: Using vot_chn values 0-3 is deprecated. Defaulting to HDMI mode.
    2025/06/16 10:48:49.221 !WARN [sp_start_display][0050]Please use the new method: pass 10 for DisplayPort (DP) or 11 for HDMI.
    2025/06/16 10:48:49.221 !INFO [OpenDisplay][0111]Wayland is available, using Wayland for rendering.

    Using default socket path: /run/user/1000/wayland-0
    sp_start_display success!

RTSP 拉流解码

本示例rtsp2display实现了拉取rtsp码流、解码,并通过HDMI输出视频图像的功能,用户可通过显示器预览画面。

示例流程框图:

rtsp2display

  • 环境准备:

    • 通过 HDMI 线缆连接开发板和显示器

    • 开发板上电,并通过命令行登录

    • 准备rtsp码流作为输入源,使用系统预置的推流服务。该服务会把1080P_test.h264视频文件处理成 rtsp 流,url 地址为rtsp://127.0.0.1/1080P_test.h264。用户可通过如下命令启动推流服务:

      cd /app/pydev_demo/07_decode_rtsp_stream/
      root@ubuntu:/app/pydev_demo/07_decode_rtsp_stream# sudo chmod +x live555MediaServer
      root@ubuntu:/app/pydev_demo/07_decode_rtsp_stream# sudo ./live555MediaServer &
  • 运行方式: 示例代码以源码形式提供,需要使用make命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/cdev_demo/rtsp2display
    sunrise@ubuntu:/app/cdev_demo/rtsp2display$ make #可能会打印一些警告信息,无需理会
    sunrise@ubuntu:/app/cdev_demo/decode2display$ ./rtsp2display -i rtsp://127.0.0.1/1080P_test.h264 -t tcp

    参数配置:

    • -i: 码流 url 地址
    • -t: 传输类型,可选 tcp / udp
  • 预期效果: 程序正确运行后,视频画面会通过开发板的HDMI接口输出,用户可以通过显示器预览视频画面。运行 log 如下:

    sunrise@ubuntu:/app/cdev_demo/rtsp2display$ ./rtsp2display -i rtsp://127.0.0.1/1080P_test.h264 -t tcp
    [UCP]: log level = 3
    [UCP]: UCP version = 3.7.3
    [VP]: log level = 3
    [DNN]: log level = 3
    [HPL]: log level = 3
    [UCPT]: log level = 6
    avformat_open_input ok!
    avformat_find_stream_info ok!
    Input #0, rtsp, from 'rtsp://127.0.0.1/1080P_test.h264':
    Metadata:
    title : H.264 Video, streamed by the LIVE555 Media Server
    comment : 1080P_test.h264
    Duration: N/A, start: 0.040000, bitrate: N/A
    Stream #0:0: Video: h264 (High), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    av_dump_format ok!
    rtsp_w:1920,rtsp_h:1080
    display_w:1920,dispaly_h:1080
    2025/06/16 10:57:21.724 !WARN [sp_start_display][0049]Warning: Using vot_chn values 0-3 is deprecated. Defaulting to HDMI mode.
    2025/06/16 10:57:21.724 !WARN [sp_start_display][0050]Please use the new method: pass 10 for DisplayPort (DP) or 11 for HDMI.
    2025/06/16 10:57:21.724 !INFO [OpenDisplay][0111]Wayland is available, using Wayland for rendering.

    Using default socket path: /run/user/1000/wayland-0
    2025/06/16 10:57:21.793 !INFO [CamInitPymParam][0258]Setting PYM channel:0: crop_x:0, crop_y:0, input_width:1920, input_height:1080, dst_w:1920, dst_h:1080
    sp_open_vps success!
    Could not read frame ---(error 'End of file')
  • 注意事项:

    • 使用 UDP 协议传输码流时,可能出现因网络丢包导致的花屏现象,此时可切换成 TCP 协议传输解决。

VPS 缩放示例

本示例实现了基于视频处理模块VPS的视频缩放功能,用户可通过显示器预览画面。

  • 环境准备:

    • 通过 HDMI 线缆连接开发板和显示器
    • 开发板上电,并通过命令行登录
    • 准备图像(NV12)、视频文件(H264)作为输入
  • 运行方式: 示例代码以源码形式提供,需要使用make命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/cdev_demo/vps
    sunrise@ubuntu:/app/cdev_demo/vps$ make
    sunrise@ubuntu:/app/cdev_demo/vps$ ./vps -m 1 -i input_1080p.h264 -o output1.yuv --iheight 1080 --iwidth 1920 --oheight 720 --owidth 1280
    sunrise@ubuntu:/app/cdev_demo/vps$ ./vps -m 2 -i input_1080p.yuv -o output.yuv --iheight 1080 --iwidth 1920 --oheight 720 --owidth 1280

    参数配置:

    • -i: 待操作的文件路径
    • --iheight: 输入高度
    • --iwidth: 输入宽度
    • -m: 输入模式,1:视频流;2:NV12 图片
    • -o: 输出路径
    • --oheight: 输出高度
    • --owidth: 输出宽度
    • --skip:(可选)对于视频流输入,调过开头的帧数
  • 预期效果: 程序正确运行后,当前目录会保存处理后的图像文件outpu.yuv。运行 log 如下:

    sunrise@ubuntu:/app/cdev_demo/vps$ ./vps -m 1 -i input_1080p.h264 -o output1.yuv --iheight 1080 --iwidth 1920 --oheight 720 --owidth 1280
    [UCP]: log level = 3
    [UCP]: UCP version = 3.7.3
    [VP]: log level = 3
    [DNN]: log level = 3
    [HPL]: log level = 3
    [UCPT]: log level = 6
    2025/06/16 10:33:02.709 !INFO [CamInitPymParam][0258]Setting PYM channel:0: crop_x:0, crop_y:0, input_width:1920, input_height:1080, dst_w:1280, dst_h:720
    sunrise@ubuntu:/app/cdev_demo/vps$ ./vps -m 2 -i input_1080p.yuv -o output.yuv --iheight 1080 --iwidth 1920 --oheight 720 --owidth 1280
    [UCP]: log level = 3
    [UCP]: UCP version = 3.7.3
    [VP]: log level = 3
    [DNN]: log level = 3
    [HPL]: log level = 3
    [UCPT]: log level = 6
    2025/06/16 10:33:29.134 !INFO [CamInitPymParam][0258]Setting PYM channel:0: crop_x:0, crop_y:0, input_width:1920, input_height:1080, dst_w:1280, dst_h:720
    ... 省略 ...