news 2026/9/3 13:19:45

音视频开发项目-1开篇

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
音视频开发项目-1开篇

开篇:这个项目要做什么,我是怎么设计的

系列目录:

  • 01 开篇:项目与整体设计(本篇)
  • 02 从主函数开始看起
  • 03 RKMedia 三大模块初始化(VI / VENC / RGA)
  • 04 通道绑定与任务分发
  • 05 数据是怎么流动的:三大工作线程
  • 06 VIDEO_QUEUE:生产者消费者队列
  • 07 FFmpeg 推流侧的初始化
  • 08 AVPacket 搬运工与写帧
  • 09 Makefile、交叉编译与工程总结

一、这个项目是干嘛的

一句话:RV1126 开发板采集摄像头画面 → 硬件编码成 H264 → 用 FFmpeg 打包推到流媒体服务器(RTMP)

说白了就是让一块板子当"直播摄像头"用。这是我做的一套嵌入式推流方案:采集、编码全部吃 RV1126 的硬件能力,FFmpeg 只负责封装和网络发送,最后双路码流(1080P 高清 + 720P 低清)同时推向 RTMP 服务器。

设计目标从一开始就定得很清楚:

  1. 实时性:1080P@25fps 全程硬件链路,CPU 留给业务层;
  2. 双档清晰度:观众网速好看 1080P,网速差看 720P,一次采集两路输出;
  3. 结构清晰:每一层职责单一,以后往上叠功能(水印、QP 采集、音频)都有现成的插入点。

二、文件组织:先把"地图"画好

写第一行代码之前,我先定了文件命名规范——项目里那份《文件命名前缀规范说明.md》就是干这个的。前缀即层次:

前缀是什么层次干嘛的
rv1126_硬件层芯片平台相关,比如 ISP 图像处理
rkmedia_SDK 层Rockchip 的 RKMedia API 封装
ffmpeg_第三方库层推流相关的数据结构(队列)
sample_官方示例Rockchip 给的参考代码,基本不动

我的类比:

rv1126_* = 地基和框架(硬件基础) rkmedia_* = 水电管道(SDK 基础设施) ffmpeg_* = 装修材料(第三方功能库) sample_* = 装修图纸(官方参考方案) main.cpp = 房子整体(你的应用)

为什么这么较真?因为嵌入式项目最容易烂在"文件越多越乱"上。前缀定了层次,看文件名就知道该去哪个文件改东西——三个月后的我自己也是受益人。

三、整体架构:一张图说清楚

这是我最先画出来的设计图,整个项目就是照着它落地的:

三个我最得意的设计决策,后面每篇都会展开:

  1. 两路码流不是两次采集。摄像头只采一次 1080P,高清路直接编码;低清路靠 RGA 硬件缩放成 720P 再进第二个编码通道。一路传感器出两档清晰度,sensor 和 VI 的开销一分钱不多花。
  2. RKMedia 和 FFmpeg 之间用队列解耦。硬件出数据的节奏和网络消费的节奏天然对不上,中间塞一个带锁的队列,两边各跑各的线程,互不牵连——这是整个架构的"轴承"。
  3. 编码完全交给硬件,FFmpeg 不编码。VENC 出来的就是 H264 码流,FFmpeg 只干"参数对接 + 封装 + 发网络"。CPU 占用从源头上就压住了。

四、这个系列怎么写

按"从骨架到血肉、顺着数据流方向"的顺序,每篇一个主题:

  1. README.md→ 知道项目干什么的,入口在哪
  2. 文件命名前缀规范说明.md→ 建立文件地图
  3. rv1126_ffmpeg_main.cpp→ 30 多行的程序骨架
  4. rkmedia_module_function.cpp→ 所有硬件模块的参数
  5. rkmedia_assignment_manage.cpp→ 绑定关系 + 线程创建
  6. rkmedia_data_process.cpp→ 线程函数实现,数据流核心
  7. ffmpeg_video_queue.cpp→ 队列组件
  8. rkmedia_ffmpeg_config.cpp→ FFmpeg 侧初始化
  9. Makefile→ 交叉编译链条

后面每篇我会按这个套路写:

  • 这部分代码在干嘛(一句话)
  • 当时为什么这么设计(设计动机,这个最重要)
  • 关键代码贴出来,配注释
  • 后续的演进方向

下一篇:从主函数开始看起 —— 一个 30 行的 main 里藏着整个程序的生命周期。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 13:19:28

贪心算法与二分答案实战:从“书页”问题看最小化最大值的经典解法

1. 项目概述:从一道模拟赛题看贪心算法的实战拆解最近在整理过去的算法竞赛题目,翻到了这道“书页”题。它来自一场模拟赛,标签是“贪心”,但实际做下来,发现远不止一个“贪”字那么简单。很多刚接触贪心算法的朋友&am…

作者头像 李华
网站建设 2026/8/31 11:34:56

432道MySQL面试题 161 - 180 题

为方便阅读,这里整理了整个系列的索引导航。本系列共 432 道 MySQL 面试题,按每 20 题为一篇进行连载,点击下方链接即可跳转到对应章节,方便你按需查阅、系统复习。 432道MySQL面试题 1 - 20 题 432道MySQL面试题 21 - 40 题 432道MySQL面试题 41 - 60 题 432道MySQL面试题…

作者头像 李华
网站建设 2026/8/31 23:42:26

解决超声波测距稳定增长问题:从HC-SR04原理到STC15单片机代码优化

1. 项目概述:从“稳定增长”现象切入超声波测距核心最近在准备蓝桥杯单片机竞赛,特别是国赛和客观题部分,很多同学在调试超声波测距模块时,都会遇到一个经典又让人头疼的问题:代码烧录进去,超声波模块的返回…

作者头像 李华
网站建设 2026/9/1 5:41:08

双2.5G网口+AMD AI芯片的迷你主机:软路由、虚拟机与本地AI一体机

上周有个朋友问我:有没有一台小主机,能当软路由、能跑几个虚拟机、偶尔还能玩点本地小模型?我当时还没给出明确答案,因为他提的要求其实很分裂:软路由需要网口够多、功耗够省;本地 AI 推理需要 CPU 强、内存…

作者头像 李华
网站建设 2026/9/2 8:27:52

水面无人艇控制实战:从系统建模到PID轨迹跟踪与参数整定

简介:在无人系统运动控制领域,PID控制凭借结构简单、参数物理意义明确等优势,依然是工程落地的首选算法。但面对水面无人艇这类存在强非线性、模型不确定性与环境扰动的欠驱动系统,仅靠PID调试经验难以获得理想效果,其…

作者头像 李华