音视频推流项目的讲解
- 项目介绍
本项目通过 RV1126 采集摄像头和麦克风数据,采用 H.264 / H.265 视频编码技术和 AAC 音频编码技术进行压缩和合成复合流,然后推送到流媒体服务器。
- 项目框图
下图展示了整个项目的总体流程图,核心部分包括:
暂时无法在飞书文档外展示此内容
2.1 视频采集与编码
-
使用 RV1126 的 API 对 CMOS 摄像头 进行采集,并进行 H.264 / H.265 编码。
-
编码后的视频数据存放到 视频编码队列。
2.2 音频采集与编码
-
使用 RV1126 的 API 对 麦克风 进行采集,并进行 AAC 编码。
-
编码后的音频数据存放到 音频编码队列。
2.3 音视频流合成与推流
-
利用 FFmpeg 的 API,对视频和音频数据进行 时间戳对齐。
-
从视频队列和音频队列中分别取出数据,合成复合流,并推送到流媒体服务器。
- 每个源代码模块的讲解
3.1 rv1126_ffmpeg_main.cpp
(主模块代码)
-
该模块的主要功能是 初始化所有模块,包括:
-
初始化 FFmpeg 合成模块。
-
初始化 音视频编码队列。
-
初始化 RV1126 VI 、VENC、 AI 、AENC 模块。
-
启动线程进行音视频推流。
-
3.2 rkmedia_assignment_manage.cpp
(任务管理模块)
-
管理 RV1126 上的各个任务。主要任务是创建并管理三个线程:
-
视频编码线程 (
camera_venc_thread
)。 -
音频编码线程 (
audio_aenc_thread
)。 -
音视频合成推流线程 (
push_server_thread
)。
-
3.3 rkmedia_data_process.cpp
(数据处理模块)
-
实现了三个线程的具体功能:
-
视频编码线程:处理视频编码和数据存储。
-
音频编码线程:处理音频编码和数据存储。
-
音视频合成并推流线程:将音视频数据进行合成并推送到服务器。
-
3.4 rkmedia_module_function.cpp
(功能模块开发)
-
包含以下功能的实现:
-
VI 模块 初始化。
-
VENC模块 初始化。
-
AI 模块 初始化。
-
AENC模块 初始化。
-
-
初始化后绑定设备节点,为推流做准备。
3.5 rkmedia_module.cpp
(任务功能模块)
-
实现了 3.4 中的具体功能:
- 初始化 VI 模块 、VENC模块 、AI 模块 、AENC模块。
3.6 rkmedia_container.cpp
(容器管理模块)
- 主要功能是保存 VI 和 AI 初始化的设备节点,供多线程使用。
3.7 rkmedia_ffmpeg_config.cpp
(FFmpeg合成模块)
-
该模块实现了 FFmpeg 合成模块的初始化:
-
初始化 FFmpeg 复合器。
-
配置 流地址 初始化。
-
3.8 ffmpeg_video_queue.cpp
(视频编码队列实现)
-
负责管理 视频编码队列,包括:
- 视频队列的创建、添加、删除等操作。
3.9 ffmpeg_audio_queue.cpp
(音频编码队列实现)
-
负责管理 音频编码队列,包括:
- 音频队列的创建、添加、删除等操作。
3.10 rv1126_isp_function.cpp
(ISP功能模块)
- 实现了 RV1126 ISP 模块 的功能初始化