嵌入式系统通常是一个资源受限嘚系统因此直接在嵌入式系统的硬件平台上编写软件 比较困难,有时候甚至是不可能的 目前的解决方法是采用宿主机、目标机的开发模式。在宿主机上编写程序通过交叉编 译器生成目标板上可以执行的二进制代码。然后通过文件系统将二进制代码放在特定 目录下,茬目标板上运行 宿主机:VMWARE \ ubuntu(服务器:192.168.1.101)
参见卖方附赠视频教程“SDK 安装及编译视频.avi” 。 nfs 文件系统挂载: 挂载点改变修改/etc/exports 文件具体方法自荇谷歌。
首先要有这样一个意识即对开发板进行的配置,是以我们的需求为基础的我们所做的工 作在系统层次图的 应用层 部分:
所需嘚函数统一由 MPP(媒体处理平台)提供接口。MPP 封装实现了基本功能函数屏蔽 掉了对底层的操作。 sample_venc.c 为完成视频采集编码一系列操作的代码觀察其代码风格如下: 1.函数返回值作为状态码,用以判断函数是否执行成功 2.函数需要传出的值通过全局变量或地址传出。
现在以函数先後顺序(也即视频采集编码处理流程)对各步骤做以说明
2.1 配置视频缓存池:
视频缓存池作用: 视频缓存池主要向媒体业务提供大块物理內存管理功能, 负责内存的 分配和回收 充分发挥内存缓存池的作用, 让物理内存资源在各个媒体处理模块中合理使用 由于视频输入通噵不提供创建和销毁公共视频缓存池功能,因此在系统初始化之前, 必须为视频输入通道配置公共视频缓存池根据业务的不同,公共緩存池的数量、缓存块的 大小和数量会有所不同
由于 MPP 系统的正常运行依赖于缓存池,因此必须先调用 HI_MPI_VB_Init 初始 化缓存池再初始化 MPP 系统。 如果多次初始化仍会返回成功,但实际上系统不会对 MPP 的运行状态有任何影 响函数 SAMPLE_COMM_SYS_Init 完成 MPP 系统初始化。
(函数皆由 MPP 提供接口)
2.4 启动视频处理模块
根据 制式和分辨率 获得图像宽和高的具体数据再由此确定通道属性,进行配置 每一个通道 对应一系列的 硬件和软件功能模块 ,通噵可以进行“串联” 以完成一系列处 理。通道的“串联”在开发文档中成为 通道绑定在整个处理流程中,要先后经过如下的 通道绑定: VI----VPSS VPSS----VENC(后者绑定前者)
主要根据制式和分辨率 获得图像宽和高的具体数据再由此确定通道属性,进行配置然 后使能 VPSS 通道。
函数由 MPP 提供矗接调用。
首先创建编码组再创建编码通道。 (编码通道组是指芯片启动一次能够同时处理的编码 通道的集合。通道组模块接收外部原始图像数据而不关心图像数据是来自哪个 外部模块。我的理解是主通道为物理通道所有绑定与同一物理通道的扩展通道,其数据源 昰一样的关于他们的具体关系,参见开发参考文档的“6 视频编码模块------ 6.2.2 编码通 道与通道组” )然后将编码通道注册到通道组。接着开启編码通道接收输入图像
在这里新开了一个线程专门用于接收码流。 具体思路为: 把编码通道映射为一个文件句柄(函数 HI_MPI_VENC_GetFd 完成此操作) 接着的所有 操作都是对文件句柄进行的。 这完全类似于端口通信中将端口打开视作文件句柄 然后进行 读写操作。 流程图如下: >1. 获取通道嘚文件句柄 >2. 从 各 通 道 获 取 码 流 。 ( 这 里 一 共 有
>2.3 获取一帧数据 >2.4 根据编码类型存数据。 >2.5 释放流 (不及时释放,当视频缓冲池满时即停止編码) >2.6 释放分配的内存 >2.7 关闭文件句柄。 >2.8 循环执行以上 7 步
软件开发工具包 媒体处理平台 自动光圈控制 视频编码单元 智能加速引擎 时间戳 DDR 控制器 媒体内存区域 感兴趣区域
1. 当输入图像大小与编码通道宽高完全匹配时,才能启动编码通道进行编码 2. 未尽事宜,参阅开发完档