-
Notifications
You must be signed in to change notification settings - Fork 6
encoder
shixuemei edited this page Nov 20, 2017
·
4 revisions
UnionEncoder模块中可任意添加音视频的编码器,所有编码器的供应商只要保证在OC层实现 UnionEncoder协议的wrapper 即可无缝接入推流SDK中.
UnionEncoder协议定义了通用的编码器需要实现的接口. 在Kit代码中演示了相应接口的调用方法.
本SDK的libUnionEncoder.a中内置了iOS系统提供的VideoToolBox和AudioToolBox编码器的实现, 可以直接调用.
1. 参数设置
UnionEncoder 通过 UnionEncoderCfg 来传递初始化参数到编码器.
/**
配置编码器参数
@param cfg 编码器参数
@return 构造的对象
*/
- (id)initWithConfig:(UnionEncoderCfg*)cfg;
UnionEncoderCfg 是一个C语言中的union类型, 音频和视频编码器都要分别创建一个实例, 通过a来访问音频配置参数, 通过v来访问视频配置参数.
这里配置的参数为音视频编码器必需的参数, 其他特别的辅助参数可以每个编码器自行实现接口来设置.
2.1 开始编码
/**
* 开始编码.
@return 是否开始成功
*/
- (BOOL) start;
- 在开始编码时, 需要按照预先配置的编码器参数,对实际的编码器进行配置, 当该编码器能满足配置时, 返回成功
- 如果用户配置的参数错误, 应该返回失败
2.2 送入原始数据
/**
编码数据输入函数
@param frame 送入的数据
@param completion 完成回调
*/
- (void)processAVFrame:(UnionAVFrame*)frame
onComplete:(void (^)(BOOL))completion;
这里定义了UnionAVFrame的结构体用于存储未压缩的音频或视频数据, 实现该方法时, 需要将结构体中的有效数据送入内部的编码器进行编码. 完成编码后通过completion回调返回编码是否成功的结构. 对于一般比较耗时的编码方法, 建议是将该接口实现为异步调用的方式.
2.3 获取编码完成数据
/// 输出编码后的压缩数据
@property(nonatomic, copy) void(^encodedPacketCallback)(UnionAVPacket * pkt);
上层用户可以通过设置该回调函数,来得到编码后的数据. 这里定义了UnionAVPacket的结构体来存储编码后的音视频数据.
2.3 清理和结束编码
/**
* 停止编码.
*/
- (void) stop;
/**
* flush当前编码器.
*/
- (void) flush;
有些编码器内部有缓存, 在停止编码前, 需要将内部的缓存flush出来.
2.4 编码码率动态调整
/**
编码过程中动态设置目标码率
@param bitrate 新的目标码率 单位为bps
*/
- (void) adjustBitrate:(int) bitrate;
在初始配置中, 指定了启动编码器时的目标码率, 但是在编码过程中, 可能会需要根据当前网络的状况调整这个目标码率. 该功能可通过此接口实现.
2.5 编码参数变化回调
/// 编码器参数变化回调
@optional
@property(nonatomic, copy) void(^encoderConfigUpdateCallback)(UnionEncoderCfg* cfg);
3.1 编码器配置信息
/** 当前的编码参数 */
@property (nonatomic, readonly) UnionEncoderCfg* encoderCfg;
3.2 错误信息
@property (nonatomic, readonly) NSError* error;
当编码发生错误时, 比如start 返回失败 和编码的结束回调返回失败, 可以通过本接口查询具体的错误信息
3.3.1 丢掉的frame数量
/**
* 获取当次编码过程中丢掉的frame数量.
*/
@property (nonatomic, readonly) int frameDropped;
3.3.2 已编码的frame数量
/**
* 获取当次编码过程中已编码的frame数量.
*/
@property (nonatomic, readonly) int frameEncoded;