Skip to content

encoder

shixuemei edited this page Nov 20, 2017 · 4 revisions

编码器接口说明

UnionEncoder模块中可任意添加音视频的编码器,所有编码器的供应商只要保证在OC层实现 UnionEncoder协议的wrapper 即可无缝接入推流SDK中.

UnionEncoder协议定义了通用的编码器需要实现的接口. 在Kit代码中演示了相应接口的调用方法.

本SDK的libUnionEncoder.a中内置了iOS系统提供的VideoToolBox和AudioToolBox编码器的实现, 可以直接调用.

UnionEncoder 通过 UnionEncoderCfg 来传递初始化参数到编码器.

/**
 配置编码器参数
 
 @param cfg 编码器参数
 @return 构造的对象
 */
- (id)initWithConfig:(UnionEncoderCfg*)cfg;

UnionEncoderCfg 是一个C语言中的union类型, 音频和视频编码器都要分别创建一个实例, 通过a来访问音频配置参数, 通过v来访问视频配置参数.

这里配置的参数为音视频编码器必需的参数, 其他特别的辅助参数可以每个编码器自行实现接口来设置.

2. 编码过程

/**
 * 开始编码.
 @return 是否开始成功
 */
- (BOOL) start;
  • 在开始编码时, 需要按照预先配置的编码器参数,对实际的编码器进行配置, 当该编码器能满足配置时, 返回成功
  • 如果用户配置的参数错误, 应该返回失败
/**
 编码数据输入函数

 @param frame 送入的数据
 @param completion 完成回调
 */
- (void)processAVFrame:(UnionAVFrame*)frame
            onComplete:(void (^)(BOOL))completion;

这里定义了UnionAVFrame的结构体用于存储未压缩的音频或视频数据, 实现该方法时, 需要将结构体中的有效数据送入内部的编码器进行编码. 完成编码后通过completion回调返回编码是否成功的结构. 对于一般比较耗时的编码方法, 建议是将该接口实现为异步调用的方式.

/// 输出编码后的压缩数据
@property(nonatomic, copy) void(^encodedPacketCallback)(UnionAVPacket * pkt);

上层用户可以通过设置该回调函数,来得到编码后的数据. 这里定义了UnionAVPacket的结构体来存储编码后的音视频数据.

/**
 * 停止编码.
 */
- (void) stop;
/**
 * flush当前编码器.
 */
- (void) flush;

有些编码器内部有缓存, 在停止编码前, 需要将内部的缓存flush出来.

/**
 编码过程中动态设置目标码率
 
 @param bitrate 新的目标码率 单位为bps
 */
- (void) adjustBitrate:(int) bitrate;

在初始配置中, 指定了启动编码器时的目标码率, 但是在编码过程中, 可能会需要根据当前网络的状况调整这个目标码率. 该功能可通过此接口实现.

/// 编码器参数变化回调
@optional
@property(nonatomic, copy) void(^encoderConfigUpdateCallback)(UnionEncoderCfg* cfg);

3. 编码器信息查询

/** 当前的编码参数 */
@property (nonatomic, readonly) UnionEncoderCfg* encoderCfg;
@property (nonatomic, readonly) NSError* error;

当编码发生错误时, 比如start 返回失败 和编码的结束回调返回失败, 可以通过本接口查询具体的错误信息

3.3 帧数统计(可选接口)

/**
 * 获取当次编码过程中丢掉的frame数量.
 */
@property (nonatomic, readonly) int frameDropped;
/**
 * 获取当次编码过程中已编码的frame数量.
 */
@property (nonatomic, readonly) int frameEncoded;