iOS

# 音频管理

Juphoon 音视频能力平台及终端的媒体引擎支持音频质量保障能力,Juphoon RTC SDK 提供视频通话过程中座席端实现音频管理的功能。

# 1. 控制音频流上传

通话中的成员可通过调用 enableUploadAudioStream (opens new window) 方法来开启关闭发送本地音频流。

/**
 * 开启/关闭发送本地音频流
 *
 * 通话中调用该方法可开启或关闭发送本地音频流。开启后,通话中的成员将听见本端声音;关闭后,通话中成员将听不见本端声音  <br>
 * 通话中调用此方法成功后,服务器会更新状态并同步给通话中所有成员,即所有成员会收到 {@link JRTCGuestCallback#onMemberUpdate onMemberUpdate} 或 {@link JRTCAgentCallback#onMemberUpdate onMemberUpdate} 回调,具体可关注 {@link JRTCRoomParticipant.ChangeParam#audio audio} 和 {@link JRTCRoomParticipant#isAudio audio} <br>
 * 通话中调用此方法不影响接收其他成员的音频流
 * @param enable 开启/关闭发送本地音频流
 * - true: 开启,即发送本地音频流
 * - false: 关闭,即不发送本地音频流
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean enableUploadAudioStream(boolean enable);

通话中成员音频流变化通过实现 JRTCAgentCallback (opens new window) 中的 onMemberUpdate (opens new window) 接口上报。

/**
 * 通话中成员属性更新回调
 *
 * 常用的有 {@link JRTCRoomParticipant.ChangeParam#volume 音量值}、{@link JRTCRoomParticipant.ChangeParam#audio 音频上传状态}、{@link JRTCRoomParticipant.ChangeParam#video 视频上传状态}等。<br>
 * 例如当通话中有成员关闭视频传输,通话中所有成员都会收到此回调。
 * @param participant 属性更新的成员对象
 * @param changeParam 更新的属性对象
 */
void onMemberUpdate(JRTCRoomParticipant participant, ChangeParam changeParam);

示例代码:

// 关闭音频流发送
agent.enableUploadAudioStream(false);
// 开启音频流发送
agent.enableUploadAudioStream(true);
// 通话中其他成员属性更新回调
public void onMemberUpdate(JRTCRoomParticipant part, JRTCRoomParticipant.ChangeParam param) {
    if(param.audio){
     if(part.isAudio) {
     	// 该成员打开了音频流
     } else {
     	// 该成员关闭了音频流
     }
    }
};

# 2. 自定义音频输入

通话中可以自定义从外部音频文件作为音频源输入,使用场景举例:比如共享本地音频。

/**
 * 开始/结束播放本地音频文件作为音频源输入
 * @note 如果用户正在通话中,该音频将播放到通话内,通话中所有成员包括自己都能听到
 *
 * @param enable     - true: 开始输入,当输入完成后会收到 {@link JRTCMediaDeviceCallback#onFileAudioInputDidFinish() onFileAudioInputDidFinish} 回调通知
 *                   - false: 结束输入,会收到 {@link JRTCMediaDeviceCallback#onFileAudioInputDidFinish() onFileAudioInputDidFinish} 回调通知
 * @param filePath   音频文件路径,支持pcm,wav的格式(需要单声道,采样率16K音频文件)
 * @param loop       是否循环播放
 * @note 重复调用会覆盖
 * @return 接口调用结果
 * - true: 接口调用成功,
 * - false: 接口调用异常
 */
public abstract boolean enableAudioInputFromFile(boolean enable, String filePath, boolean loop);

/**
 * 暂停/继续本地文件音频源输入
 *
 * @param suspend
 * - true 暂停
 * - false 继续
 * @return 调用是否正常
 * - true:正常执行调用流程
 * - false:调用异常
 */
public abstract boolean suspendAudioInputFromFile(boolean suspend);

音频输入播放结束(非循环播放结束或者主动停止播放),会收到 JRTCMediaDeviceCallback (opens new window)onFileAudioInputFinish (opens new window)回调通知

/**
 * 本地文件音频源输入完成回调
 */
void onFileAudioInputDidFinish();

示例代码:

// 开始分享本地文件音频输入到通话内
mediaDevice.enableAudioInputFromFile(true, "/sdcard/1.pcm", true);
mediaDevice.enableAudioInputFromFile(false, "", true);

void onFileAudioInputFinish() {
    // 分享本地文件音频输入到通话结束
}

# 3. 本地音频播放

通话中可以播放一段本地音频,使用场景举例:比如播放来电铃声。

/**
 * 开始播放音频
 *
 * - 当播放音频文件完成后会收到 {@link JRTCMediaDeviceCallback#onRingPlayFinish() onRingPlayFinish} 回调通知
 * @param filePath 音频文件路径,支持pcm,wav的格式(需要单声道,采样率16K音频文件)
 * @param isLoop 是否循环播放
 * @return 播放音频结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean startRing(String filePath, boolean isLoop);

/**
 * 结束播放音频
 *
 * - 会收到 {@link JRTCMediaDeviceCallback#onRingPlayFinish() onRingPlayFinish} 回调通知
 * @return 关闭音频结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean stopRing();

音频播放结束会收到 JRTCMediaDeviceCallback (opens new window)onRingPlayFinish (opens new window) 回调通知

/**
 * 音频播放完成回调
 */
void onRingPlayFinish();

示例代码:

// 开始播放本地音频
mediaDevice.startRing("/sdcard/1.pcm", true);
// 结束播放本地音频
mediaDevice.stopRing();

void onRingPlayFinish() {
    // 本地音频播放结束
}

# 4. 音频异常回调

通过实现 JRTCMediaDeviceCallback (opens new window)onAudioError (opens new window) 接口监听音频异常回调,具体原因查看参数 error 描述。

/**
 * 音频异常回调
 * @param error   报错信息
 */
void onAudioError(String error);