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

推流过程:
计划实现两种视频来源
- 网络摄像头
例如本地电脑的摄像头,通过win下的ffmpeg,经过RTMP协议推流到流媒体服务器 - MIPI摄像头
使用MPP接口采集并编码开发板连接的MIPI摄像头数据,经过ffmpeg封装后推流到流媒体服务器
拉流过程:
- 使用ffmpeg拉流服务器视频,同时解析视频流的参数信息,存入共享内存
- 使用MPP解码视频流,获取YUV格式视频数据,存入共享内存
渲染过程
- 取出共享内存中的视频参数数据,通过QLabel渲染到屏幕
- 取出共享内存中的YUV数据,包装为OpenCv,转换为RGB格式,通过QImage渲染到屏幕
项目功能拆解
QT界面程序
QT界面分别有pushstream_button_widget界面、ffmpeg_config_widget界面、video_widget界面和process_enc.start(./mpi_enc_dec_ffmpeg)来启动MPP程序。

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

被折叠的 条评论
为什么被折叠?



