iOS 无法直接采集双声道,用户如果想实现播放的音频具有双声道效果,可以参考本文。本文为即构科技音视频SDK(ZegoLiveRoom SDK )高级功能系列第九篇——双声道。
双声道效果实现的主流程为:
下文将分别讲述各个步骤。
1、 输入双声道数据
主播端输入的数据需要确保为双声道数据,有以下几种方式可以实现:
1.1 业务方通过外部采集接口,输入双声道 PCM 数据给 SDK 编码后再发送,流程如下图所示:
1.2 业务方通过外部采集接口,输入双声道 AAC 编码后数据给 SDK 发送,流程如下图所示:
音频外部采集和渲染使用详见: 音频外部采集与渲染,本文不再赘述。
1.3 业务方通过外部音频前处理接口,将 SDK 采集的数据处理为双声道效果,再将 PCM 数据回传给 SDK 编码 ,流程如下图所示:
1.4 业务方通过外部音频前处理接口,将 SDK 采集的数据处理为双声道效果,再将 AAC 编码后数据回传给 SDK 编码 ,流程如下图所示:
请注意,业务方必须确保编码之前输入的 PCM 数据为双声道效果数据。如果采集为单声道数据,编码为双声道,那么这两个声道数据播放时也是不会有立体声效果的。
2、设置推流编码双声道
业务方调用该 API 设置编码双声道。该 API 需要在初始化 SDK 后,推流前调用。
ZegoLiveRoomApi-Publisher.h
/**
设置推流音频声道数
@param count 声道数,1 或 2,默认为 1(单声道)
@discussion 必须在初始化 SDK,调用推流前设置。
@note setLatencyMode 设置为 ZEGOAPI_LATENCY_MODE_NORMAL 或 ZEGOAPI_LATENCY_MODE_NORMAL2 才能设置双声道(这两个模式下默认为单声道),在移动端双声道通常需要配合音频前处理才能体现效果; setLatencyMode 设置为 ZEGO_LATENCY_MODE_LOW3 强制为双声道,就算设置为单声道也是无效的(这个音频模式下只支持双声道)。
*/
- (void)setAudioChannelCount:(int)count;
3、设置混流编码双声道
混流模式下,主播连麦后,连麦的流会经过混流服务器。为了让观众听到双声道效果,需要设置混流服务器编码为双声道。该设置项是混流配置 ZegoCompleteMixStreamConfig 中的 channels:
/** 混流配置 */
@interface ZegoCompleteMixStreamConfig : NSObject
/** outputIsUrl 为 YES,则此值为 Url;否则为流名 */
@property (copy) NSString *outputStream;
/** 输出为流名,或 Url */
@property BOOL outputIsUrl;
/** 输出帧率 */
@property int outputFps;
/** 输出码率 */
@property int outputBitrate;
/** 输出分辨率 */
@property CGSize outputResolution;
/** 音频编码 */
@property int outputAudioConfig;
/** 混流编码声道数 */
@property int channels;
/** 输入流列表 */
@property (strong) NSMutableArray<ZegoMixStreamInfo*> *inputStreamList;
/** 用户自定义数据 */
@property NSData* userData;
@end
混流参数的设置详见:混流(音视频SDK高级功能二)
4、播放双声道
由于 ZEGO SDK 默认使用双声道播放,用户使用 SDK 播放时,无需做额外的设置。但是,请注意,如果开发者采用音频外部采集和渲染,播放时需要使用双声道才会有立体声效果!