基于RK3568实现MPP+QT远程推拉流监控项目 (一)项目大纲

项目简介

本次项目使用的是瑞芯微RK3568的开发板作为芯片,MIPI摄像头作为视频流的采集编码处理、并用QT作为前端操作界面。
本项目的功能包括采集摄像头数据并利用MPP编码推流到RTMP、SRT、RTSP流媒体服务器。
支持MPP解码远程传输的H264码流,并渲染到QT界面上。同时可以通过QT编辑流媒体推流地址、拉流地址。

支持的协议包括:
推流:支持RTMP协议、SRT协议、RTSP协议
拉流:支持RTMP协议、UDP协议、SRT协议
渲染:支持QImage渲染(CPU渲染)

项目总体流程图

在这里插入图片描述

推流过程:

计划实现两种视频来源

  1. 网络摄像头
    例如本地电脑的摄像头,通过win下的ffmpeg,经过RTMP协议推流到流媒体服务器
  2. MIPI摄像头
    使用MPP接口采集并编码开发板连接的MIPI摄像头数据,经过ffmpeg封装后推流到流媒体服务器

拉流过程:

  1. 使用ffmpeg拉流服务器视频,同时解析视频流的参数信息,存入共享内存
  2. 使用MPP解码视频流,获取YUV格式视频数据,存入共享内存

渲染过程

  1. 取出共享内存中的视频参数数据,通过QLabel渲染到屏幕
  2. 取出共享内存中的YUV数据,包装为OpenCv,转换为RGB格式,通过QImage渲染到屏幕

项目功能拆解

QT界面程序

QT界面分别有pushstream_button_widget界面、ffmpeg_config_widget界面、video_widget界面和process_enc.start(./mpi_enc_dec_ffmpeg)来启动MPP程序。

在这里插入图片描述

  1. ffmpeg_config_widget
    主要功能是从界面上获取push_name(推流流媒体名称)、push_address(推流流媒体地址)、recv_name(拉流流媒体名称)、recv_address(拉流流媒体地址)的数据并存储到url_address_manage.json文件。
  2. pushstream_button_widget
    主要功能是通过QTableView显示Url_Name(拉流名称,从url_address_manage.json获取)、Url_Address(拉流地址,从url_address_manage.json获取)、Url_Protocol(拉流协议), 同时还支持start_push按钮、stop_push按钮来控制推流逻辑(start_push按钮可以开始推流, stop_push按钮来停止推流)。
  3. video_widget
    通过QImage实时渲染共享内存的MPP解码的视频数据, 并实时显示远程摄像头的参数, 这其中包括了摄像头的分辨率、拉流流媒体地址(url_address)、拉流流媒体协议(Protocol)、流媒体视频编码格式(encodeType)。

MPP后台程序

在这里插入图片描述
上图是MPP后台程序的思维框图,这里面包括9个重要步骤, 包括: init_output_ffmpeg_module初始化FFMPEG推流模块、init_ffmpeg_recv_module初始化FFMPEG的拉流模块、初始化H264比特流过滤器、初始化解码YUV共享内存、初始化远程监控参数共享内存、MPP编码模块的初始化、MPP解码模块的初始化、创建三个线程处理具体编码解码推流业务、while(1)循环获取QT发送的指令

  1. 初始化FFMPEG推流模块 (init_output_ffmpeg_module)
    准备FFmpeg以向流媒体服务器发送数据。此步骤主要包括:根据推流地址创建推流上下文、配置视频流参数、建立网络连接,并发送媒体头部信息,使模块进入待命状态。
  2. 初始化FFMPEG拉流模块 (init_ffmpeg_recv_module)
    准备FFmpeg以从服务器或文件接收数据。此步骤主要包括:连接到媒体源、解析其包含的视频/音频流信息,并找到和打开相应的解码器,为解码做好准备。
  3. 初始化H264比特流过滤器
    解决视频数据格式的兼容性问题。此步骤加载一个FFmpeg过滤器(h264_mp4toannexb),用于将从文件容器(如MP4)中取出的H.264流转换为网络传输或解码器所需的标准格式(Annex B)。
  4. 初始化解码YUV共享内存
    创建一块用于在后台和前台UI之间高效传递视频画面的内存区域。解码后的原始YUV图像帧会直接写入这块内存,UI则从中读取并渲染,避免了大量数据拷贝带来的性能开销。
  5. 初始化远程监控参数共享内存
    创建一块小型的共享内存,用于在后台和前台之间同步视频流的元数据(如分辨率、帧率、协议等)。UI通过读取这块内存来更新界面上的信息显示。
  6. MPP编码模块的初始化
    配置并准备硬件编码器。通过调用MPP(Media Process Platform)库,将视频编码这个高消耗任务交由专门的硬件处理,从而大幅降低CPU使用率,提升性能。
  7. MPP解码模块的初始化
    配置并准备硬件解码器。利用MPP硬件加速能力来解码接收到的视频流,可以更高效地将压缩数据转换为原始YUV图像,同样是为了降低CPU负载。
  8. 创建三个线程处理业务
    将核心任务并发执行以避免阻塞。程序会创建三个独立的线程:一个负责将原始数据送入硬件编码器,一个负责将编码后的数据打包推流,另一个则负责拉取并解码远程视频流。
  9. while(1)循环获取QT指令
    作为后台的主控循环,监听前端UI发来的用户指令。例如,当用户点击“开始”或“停止”时,此循环会接收到start_push或stop_push等指令,并据此来启动或停止对应的媒体处理线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值