本骗对 Encode 视频编码模块 进行分析
整体流程图
**
**
为什么要编解码? 其中最主要的原因 有利于数据传输 学过 通信原理 的同学 可以用信道 带宽等相关概念来类比理解。
视频编码(H264, H265, JPEG)模块,包含编码通道管理,编码参数设置等功能。
Encoder 模块内部结构:
如上图所示,编码模块由若干个 Group 组成,每个 Group 由编码 Channel 组成。每个编码 Channel 附带一个输出码流缓冲区,这个缓冲区由多个 buffer 组成。
目前 T31 上支持 6 个 Group,每个 Group 由 2 个 Channel 组成。最多使用 6 个Channel。
一个编码 Channel 可以完成一种协议的编码。目前每个 Group 有两个 Channel,可以添加一个 H264 编码 Channel 与一个 JPEG 编码 Channel。
下面我们可以用 理解代码流程 来了解编码器的工作模式
代码实现流程
初始化步骤
设置编码grop0,通道零0的编码分辨率大小为sensor分辨率大小
video编码器 GROUP+CHAN 初始化(创建 group ,用于传输码流和抓图,绑定venc通道到osd通道,创建 venc 通道, 将通道注册到 group)
先把bind信息注册到信息表中(即存在结构体中),后面会使用 LUX_COMM_Bind_Connect() 建立绑定
工作思路
1.通过sensorname 获取镜头分辨率 设置编码通道分辨率
2.创建GROUP
3.绑定venc通道到OSD通道(注:还未启用绑定,只是把信息存入信息表中)
4.创建VENC通道注册到group
5.初始化完毕之后,会启动编码器,但此时还未开始编码,只有当码流传过来是才开始编码
获取编码帧 (输出输出拼包转换后的码流结构)
6.通过码流通道模式获取到实际编码器通道参数(即 根据 channel 获取要进行编码的编码器通道属性)
7.polling一帧数据(即请求一段内存,用来存储编码之后的码流)
8.获取编码的码流(开始对指定 chnId 通道进行编码,码流存于 pStream 中)
9.打包码流包(将前面获取的所有帧码流打包,以便后面发送)
发送
10.发送码流包到SDK。
over~~