RV1126+FFMPEG多路码流监控项目大体讲解
一.项目介绍:
本项目采用的是易百纳RV1126开发板和CMOS摄像头,使用的推流框架是FFMPEG开源项目。这个项目的工作流程如下(如上图):通过采集摄像头的VI模块,再通过硬件编码VENC模块进行H264/H265的编码压缩,并把压缩后的数据通过FFMPEG传输到两个流媒体服务器(如同时推送到流媒体服务器:rtmp://xxx.xxx.xx.xxx:1935/live/01和rtmp://xxx.xxx.xx.xxx:1935/live/02)。这个项目我们可以学习到:多线程,队列,FFMPEG音视频数据传输等重要知识。
二.项目框架思维导图
上面是整个项目思维导图可以看出来,这个项目的main函数是整个项目的入口函数。在这里入口函数里面,需要做四个比较重要的步骤:
1.分别是rkmedia组件和功能的初始化
2.初始化高分辨率队列HIGH_VIDEO_QUEUE
3.初始化低分辨率队列LOW_VIDEO_QUEUE
4.init_rv1126_first_assignment开启RV1126的推流任务。
2.1. init_rkmedia_module_function讲解:
这个函数主要是做RKMEDIA的组件初始化,组件包括:
VI模块的初始化
高分辨率VENC模块的初始化
低分辨率VENC模块的初始化
RGA模块初始化。
2.1.1. VI模块初始化:初始化摄像头模块让其摄像头模块能够正常工作,具体的VI模块初始化在rkmedia_vi_init里面。
2.1.2. RGA模块的初始化:RGA主要是对VI模块的数据进行缩放操作,把1920 * 1080的视频数据转换成1280 * 720的视频数据。
2.1.3. VENC模块初始化(分别是高、低分辨率):初始化高、低分辨率VENC硬件编码器,这里的编码器主要针对的是1920 * 1080和1280 * 720两种分辨率,具体的高分辨率VENC模块初始化在rkmedia_venc_init里面。
2.2. 高分辨率队列的初始化HIGH_VIDEO_QUEUE:
初始化搞分辨率编码数据队列,这个队列主要是存储1920 * 1080编码的视频数据
2.3. 低分辨率队列的初始化LOW_VIDEO_QUEUE:
初始化搞分辨率编码数据队列,这个队列主要是存储1280* 720编码的视频数据
2.4. init_rv1126_first_assignment启动RV1126推流任务讲解:
这个函数主要进行多路码流推流的业务实现,这里面包含了:
init_rkmedia_ffmpeg_context分别初始化高分辨率的ffmpeg推流器和低分辨率的ffmpeg推流器
创建camera_venc_thread线程
创建get_rga_thread线程
创建low_camera_venc_thread线程
创建high_video_push_thread线程
创建low_video_push_thread线程
2.4.1. init_rkmedia_ffmpeg_context初始化高分辨率和低分辨率的推流器:
在这个函数里面主要是对FFMPEG推流器参数进行设置,它需要对高分辨率(1920 * 1080)和低分辨率(1280 * 720)的FFMPEG推流器进行初始化。
2.4.2. 创建camera_venc_thread线程
camera_venc_thread线程最重要的作用是编码1920 * 1080的编码视频数据流并且入到HIGH_VIDEO_QUEUE队列
2.4.3. 创建get_rga_thread线程
get_rga_thread线程最重要的作用是处理1920 * 1080的摄像头数据,把它的分辨率降低到1280 * 720,并且把1280 * 720的原始码流传输到低分辨率(1280 * 720)的编码器
2.4.4. 创建low_camera_venc_thread线程
low_camera_venc_thread线程最重要的作用是获取分辨率1280 * 720的编码数据,并且入到LOW_VIDEO_QUEU队列
2.4.5. 创建high_video_push_thread线程
high_video_push_thread线程作用是从HIGH_VIDEO_QUEUE队里取出每一帧1920*1080的视频编码数据,然后利用FFMPEG的推流到对应的流媒体服务器
2.4.6. 创建low_video_push_thread线程
low_video_push_thread线程作用是从LOW_VIDEO_QUEUE队里取出每一帧1280*720的视频编码数据,然后利用FFMPEG的推流到对应的流媒体服务器
项目代码源文件截图
上图是整个RV1126多路码流推流项目的代码源文件,后面基本上围绕着上图的源代码进行讲解,具体的后面的课程会详细说到