音视频开发项目-1开篇
开篇这个项目要做什么我是怎么设计的系列目录01 开篇项目与整体设计本篇02 从主函数开始看起03 RKMedia 三大模块初始化VI / VENC / RGA04 通道绑定与任务分发05 数据是怎么流动的三大工作线程06 VIDEO_QUEUE生产者消费者队列07 FFmpeg 推流侧的初始化08 AVPacket 搬运工与写帧09 Makefile、交叉编译与工程总结一、这个项目是干嘛的一句话RV1126 开发板采集摄像头画面 → 硬件编码成 H264 → 用 FFmpeg 打包推到流媒体服务器RTMP。说白了就是让一块板子当直播摄像头用。这是我做的一套嵌入式推流方案采集、编码全部吃 RV1126 的硬件能力FFmpeg 只负责封装和网络发送最后双路码流1080P 高清 720P 低清同时推向 RTMP 服务器。设计目标从一开始就定得很清楚实时性1080P25fps 全程硬件链路CPU 留给业务层双档清晰度观众网速好看 1080P网速差看 720P一次采集两路输出结构清晰每一层职责单一以后往上叠功能水印、QP 采集、音频都有现成的插入点。二、文件组织先把地图画好写第一行代码之前我先定了文件命名规范——项目里那份《文件命名前缀规范说明.md》就是干这个的。前缀即层次前缀是什么层次干嘛的rv1126_硬件层芯片平台相关比如 ISP 图像处理rkmedia_SDK 层Rockchip 的 RKMedia API 封装ffmpeg_第三方库层推流相关的数据结构队列sample_官方示例Rockchip 给的参考代码基本不动我的类比rv1126_* 地基和框架硬件基础 rkmedia_* 水电管道SDK 基础设施 ffmpeg_* 装修材料第三方功能库 sample_* 装修图纸官方参考方案 main.cpp 房子整体你的应用为什么这么较真因为嵌入式项目最容易烂在文件越多越乱上。前缀定了层次看文件名就知道该去哪个文件改东西——三个月后的我自己也是受益人。三、整体架构一张图说清楚这是我最先画出来的设计图整个项目就是照着它落地的三个我最得意的设计决策后面每篇都会展开两路码流不是两次采集。摄像头只采一次 1080P高清路直接编码低清路靠 RGA 硬件缩放成 720P 再进第二个编码通道。一路传感器出两档清晰度sensor 和 VI 的开销一分钱不多花。RKMedia 和 FFmpeg 之间用队列解耦。硬件出数据的节奏和网络消费的节奏天然对不上中间塞一个带锁的队列两边各跑各的线程互不牵连——这是整个架构的轴承。编码完全交给硬件FFmpeg 不编码。VENC 出来的就是 H264 码流FFmpeg 只干参数对接 封装 发网络。CPU 占用从源头上就压住了。四、这个系列怎么写按从骨架到血肉、顺着数据流方向的顺序每篇一个主题README.md→ 知道项目干什么的入口在哪文件命名前缀规范说明.md→ 建立文件地图rv1126_ffmpeg_main.cpp→ 30 多行的程序骨架rkmedia_module_function.cpp→ 所有硬件模块的参数rkmedia_assignment_manage.cpp→ 绑定关系 线程创建rkmedia_data_process.cpp→ 线程函数实现数据流核心ffmpeg_video_queue.cpp→ 队列组件rkmedia_ffmpeg_config.cpp→ FFmpeg 侧初始化Makefile→ 交叉编译链条后面每篇我会按这个套路写这部分代码在干嘛一句话当时为什么这么设计设计动机这个最重要关键代码贴出来配注释后续的演进方向下一篇从主函数开始看起 —— 一个 30 行的 main 里藏着整个程序的生命周期。