1 使用场景

Android 无法直接采集双声道,用户如果想实现播放的音频具有双声道效果,可以参考本文。

2 实现流程

双声道效果实现的主流程为:


下文将分别讲述各个步骤。

2.1 输入双声道数据

主播端输入的数据需要确保为双声道数据,有以下几种方式可以实现:

业务方通过外部采集接口,输入双声道 PCM 数据给 SDK 编码后再发送,流程如下图所示:


业务方通过外部采集接口,输入双声道 AAC 编码后数据给 SDK 发送,流程如下图所示:


音频外部采集和渲染使用详见: 高级功能指南-音频外部采集与渲染,本文不再赘述。

业务方通过外部音频前处理接口,将 SDK 采集的数据处理为双声道效果,再将 PCM 数据回传给 SDK 编码 ,流程如下图所示:


业务方通过外部音频前处理接口,将 SDK 采集的数据处理为双声道效果,再将 AAC 编码后数据回传给 SDK 编码 ,流程如下图所示:


音频前处理使用详见: 高级功能指南-音频前处理,本文不再赘述

请注意,业务方必须确保编码之前输入的 PCM 数据为双声道效果数据。如果采集为单声道数据,编码为双声道,那么这两个声道数据播放时也是不会有立体声效果的。

2.2 设置推流编码双声道

业务方调用该 API 设置编码双声道。该 API 需要在初始化 SDK 后,推流前调用。

ZegoLiveRoom.java

/**

* 设置推流音频声道数.

*

*

注意:

*
1. 必须在初始化 SDK,调用推流前设置。

*
2. setLatencyMode 设置为 ZEGOAPI_LATENCY_MODE_NORMAL 或 ZEGOAPI_LATENCY_MODE_NORMAL2 才能设置双声道(这两个模式下默认为单声道),在移动端双声道通常需要配合音频前处理才能体现效果; setLatencyMode 设置为 ZEGO_LATENCY_MODE_LOW3 强制为双声道,就算设置为单声道也是无效的(这个音频模式下只支持双声道)。

*

* @param count 声道数,1 或 2,默认为 1(单声道)

*/

public void setAudioChannelCount(int count)

2.3 设置混流编码双声道

混流模式下,主播连麦后,连麦的流会经过混流服务器。为了让观众听到双声道效果,需要设置混流服务器编码为双声道。该设置项是混流配置 ZegoCompleteMixStreamInfo 中的 channels:

/** 混流配置 */
public final class ZegoCompleteMixStreamInfo {
/** 输出流名或 url,
* @see #outputIsUrl
*/
public String outputStreamId;
/**
* true: outputStreamId 为完整 rtmp url,false: outputStreamId 为流名
*/
public boolean outputIsUrl;
/**
* 混流输出帧率
*/
public int outputFps;
/**
* 混流输出视频码率
*/
public int outputBitrate;
/**
* 混流输出音频码率
*/
public int outputAudioBitrate;
/**
* 混流输出视频分辨率宽
*/
public int outputWidth;
/**
* 混流输出视频分辨率高
*/
public int outputHeight;
/**
* 混流输出音频格式,默认值为 0。可选值为 0:默认编码;1:可选编码
*/
public int outputAudioConfig;
/**
* 混流输入流列表
*/
public ZegoMixStreamInfo[] inputStreamList;
/**
* 用户自定义数据
*

注意: 必须使用{@link ByteBuffer#allocateDirect}创建, 否则数据不能传递给sdk

*/
public ByteBuffer userData;
/**
* 用户自定义数据长度.
*/
public int lenOfUserData;
/**
* 混流声道数, 默认为单声道.
*/
public int channels = 1;
/**
* 混流背景颜色,前三个字节为 RGB,即 0xRRGGBBxx
*/
public int outputBackgroundColor;
/**
* 混流背景图,支持预设图片,如 (preset-id://xxx)
*/
public String outputBackgroundImage;
}

混流参数的设置详见:高级功能指南-混流

2.4 播放双声道

由于 ZEGO SDK 默认使用双声道播放,用户使用 SDK 播放时,无需做额外的设置。但是,请注意,如果开发者采用音频外部采集和渲染,播放时需要使用双声道才会有立体声效果!