iOS

# 音频管理

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

# 1. 控制音频流上传

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

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

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

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

示例代码:

// 关闭音频流发送
[_agent enableUploadAudioStream:false];

// 开启音频流发送
[_agent enableUploadAudioStream:true];

// 通话中成员属性更新回调
- (void)onMemberUpdate:(JRTCRoomParticipant *)part changeParam:(JRTCRoomParticipantChangeParam *)changeParam {
    if (changeParam.audio) {
        if (part.audio == true) {
            NSLog(@"成员 %@ 音频流打开", part.userId);
        } 
        else {
            NSLog(@"成员 %@ 音频流关闭", part.userId);   
        }  
    }
}

# 2. 自定义音频输入

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

/**
 * 开始/结束播放本地音频文件作为音频源输入
 *
 * @param enable     - true: 开始输入,当输入完成后会收到 {@link JRTCMediaDeviceCallback.onFileAudioInputDidFinish onFileAudioInputDidFinish} 回调通知
 *                - false: 结束输入,会收到 {@link JRTCMediaDeviceCallback.onFileAudioInputDidFinish onFileAudioInputDidFinish} 回调通知
 * @param filePath   音频文件路径,支持pcm,wav的格式(需要单声道,采样率16K音频文件)
 * @param loop       是否循环播放
 * @note 重复调用会覆盖
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
- (bool)enableAudioInputFromFile:(bool)enable filePath:(NSString* __nullable)filePath loop:(bool)loop;

/**
 * 暂停/继续播放语音文件作为音频源输入
 *
 * @param suspend true 暂停播放 false 继续播放
 * @return  调用是否正常
 * - true: 正常执行调用流程
 * - false:调用异常
 */
- (bool)suspendAudioInputFromFile:(bool)suspend;

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

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

示例代码:

// 开始分享本地文件音频输入到通话内
[_mediaDevice enableAudioInputFromFile:true filePath:@"/xxxxx/1.pcm" loop:true];
// 结束分享本地文件音频输入到通话内
[_mediaDevice enableAudioInputFromFile:false filePath:@"" loop:true];

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

# 3. 本地音频播放

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

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

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

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

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

示例代码:

// 开始播放本地音频
[_mediaDevice startRing:@"/xxxxx/1.pcm" isLoop:true];
// 结束播放本地音频
[_mediaDevice stopRing];

- (void)onRingPlayFinish {
    // 音频文件播放结束
}

# 4. 音频异常回调

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

/**
 * 音频异常
 *
 * @param error 异常信息
 */
- (void)onAudioError:(NSString*)error;