iOS

# 音频管理

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

# 发送本地音频流

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

/**
  * 开启/关闭发送本地音频流
  *
  * - 调用该方法可开启或关闭发送本地音频流。开启后,房间成员将听见本端声音;关闭后,房间成员将听不见本端声音
  * - 房间中调用此方法不影响接收远端音频
  * - 初始化 JRTCRoom 时,默认不发送本地音频流。若要加入房间时,让房间内其他成员听见本端声音,需要在调用 {@link #join join} 加入房间前设置
  * - 该方法在房间内和房间外均可调用,且在离开房间后该设置仍然有效。也就是说这一次设置了开启发送本地音频流,那么在下一次加入房间时默认会开启发送本地音频流
  * - 会议中也可调用此方法开启或关闭发送本地音频流,服务器会更新状态并同步给其他房间成员,即房间中所有成员都会收到 {@link JRTCRoomCallback#onParticipantUpdate onParticipantUpdate} 回调
  *
  * @param enable 开启/关闭发送本地音频流
  * - true: 开启,即发送本地音频流
  * - false: 关闭,即不发送本地音频流
  * @return 接口调用结果
  * - true: 接口调用成功
  *  - 在调用此方法时,用户未加入房间,不会收到回调
  *  - 在调用此方法时,用户已在房间中,会收到 {@link JRTCRoomCallback#onRoomPropertyChange onRoomPropertyChange} 回调
  * - false: 接口调用异常
  */
public abstract boolean enableUploadAudioStream(boolean enable);
  1. 在多方通话中,enableUploadAudioStream (opens new window) 的作用是开启或关闭发送本地音频流。开启后,房间成员将听见本端声音;关闭后,房间成员将听不见本端声音。房间中调用此方法不影响接收远端音频。
  2. 初始化 JRTCRoom 时,默认不发送本地音频流。若要加入房间时让房间内其他成员听见本端声音,需要在调用 join (opens new window) 加入房间前设置,或者在JRTCRoomJoinParam (opens new window) 设置。
  3. 房间中调用此方法开启或关闭发送本地音频流,服务器会更新状态并同步给其他房间成员同时,房间中的其他成员会收到该成员“是否上传音频“的状态变化回调 onParticipantUpdate (opens new window)
  4. 此外,此方法还可以实现开启或关闭静音的功能。当 enable 值为 false ,将会停止发送本地音频流,此时其他成员将听不到您的声音,从而实现静音功能。
/**
 * 成员属性更新回调
 * 
 * 当房间中有成员的属性发生变化时,房间中的其他成员会收到此回调,例如音频上传状态、视频上传状态、网络状态等发生变化。
 *
 * @param participant JRTCRoomParticipant 成员对象
 * @param changeParam {@link ChangeParam} 更新标识类对象
 * @param room        当前 JRTCRoom 对象
 */
void onParticipantUpdate(JRTCRoomParticipant participant, ChangeParam changeParam, JRTCRoom room);

示例代码:

// 关闭音频流发送
room.enableUploadAudioStream(false);
// 开启音频流发送
room.enableUploadAudioStream(true);
// 成员属性更新回调
void onParticipantUpdate(JRTCRoomParticipant participant, ChangeParam changeParam, JRTCRoom room){
    if(changeParam.audio){
        // 成员音频上传状态发生改变
        if(participant.isAudio){
            //该成员音频流打开
        } else{
            //该成员音频流关闭
        }
    } 
}

# 音频输出

/**
 * 开启/关闭音频输出
 *
 * - 该方法可实现本地静音功能。关闭时听不到房间内其他成员的声音,不影响其他成员;开启时可以听到其他成员声音
 * - 初始化 JCRoom 时,音频输出功能默认是开启的。若要加入房间时听不见其他成员的声音,建议在调用 {@link #join join} 加入房间前设置
 * @param enable 是否开启音频输出
 * - true: 开启音频输出
 * - false: 关闭音频输出
 * @return 接口调用结果
 * - true: 接口调用成功,会收到 {@link JRTCRoomCallback#onRoomPropertyChanged onRoomPropertyChange} 回调
 * - false: 接口调用异常
 */
public abstract boolean enableAudioOutput(boolean enable);
  1. 该方法可实现本地静音功能。关闭时听不到房间内其他成员的声音,不影响其他成员;开启时可以听到其他成员声音。
  2. 初始化 JRTCRoom (opens new window) 时,音频输出功能默认是开启的。若要加入房间时听不见其他成员的声音,建议在调用 join (opens new window) 加入房间前设置。
  3. 该方法可以关闭或重新开启音频输出功能,在房间内和房间外均可调用,且在离开房间后该设置仍然有效,也就是说这一次设置了关闭音频输出,那么下一次加入房间时也是默认关闭音频输出。
/**
 * 房间属性变化回调
 * <p>
 * 当房间的属性发生变化时,会收到此回调,例如房间中有成员发起屏幕共享、录制状态发生变化等。
 *
 * @param changeParam {@link PropChangeParam} 变化标识集合
 * @param room        当前 JRTCRoom 对象
 */
void onRoomPropertyChanged(PropChangeParam changeParam, JRTCRoom room);

示例代码:

// 关闭音频输出
room.enableAudioOutput(false);
// 开启音频输出
room.enableAudioOutput(true);
// 房间属性变化回调
void onRoomPropertyChanged(PropChangeParam changeParam, JRTCRoom room){
    if (changeParam.audioOutput) {
     	// 音频输出状态发生改变   
        if (room.audioOutput) {
         	// 当前音频为输出状态   
        } else {
         	// 当前音频未输出 
        }
    }
}

# 自定义音频输入

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

/**
 * 开始/结束播放本地音频文件作为音频源输入
 * @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() {
    // 分享本地文件音频输入到通话结束
}

# 本地音频播放

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

/**
 * 开始播放音频
 *
 * - 当播放音频文件完成后会收到 {@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() {
    // 本地音频播放结束
}

# 音频异常回调

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

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

# 音频数据回调

# 输入音频数据回调

使用以下接口 setAudioInputFrameCallback (opens new window) 可以获取到本地音频输入数据回调,前提需要打开音频输入设备(麦克风)

/**
 * 设置音频输入帧回调
 *
 * @param callback AudioInputFrameCallback 接口对象
 */
public abstract void setAudioInputFrameCallback(AudioInputFrameCallback callback);

/**
 * 音频输入数据回调
 */
public interface AudioInputFrameCallback {
    /**
     * 音频输入数据回调
     *
     * @param inputId      输入源的自定义字符串
     * @param sampleRateHz 输入源的采样频率
     * @param channels     输入源的频道数量
     * @param data         该帧的采样数据
     */
    void onFrame(String inputId, int sampleRateHz, int channels, ByteBuffer data);
}

示例代码:

mediaDevice.setAudioInputFrameCallback(new AudioInputFrameCallback() {
    void onFrame(String inputId, int sampleRateHz, int channels, ByteBuffer data) {
        //音频输入数据回调
    }
});

# 输出音频数据回调

如果需要房间内其他成员的音频输出数据回调,可以通过以下接口 setAudioOutputFrameCallback (opens new window) 设置回调接口

/**
 * 设置输出音频帧回调,传null关闭回调
 *
 * @param callback 回调对象
 * @return
 * - true  设置成功
 * - false 设置失败
 */
public boolean setAudioOutputFrameCallback(AudioOutputFrameCallback callback);

/**
 * 输出音频数据回调
 */
public interface AudioOutputFrameCallback {
    /**
     * 输出音频数据回调,自己的音频不会回调
     *
     * @param data           10毫秒的实时PCM数据
     * @param length         PCM数据长度
     * @param sampleRateHz   采样频率
     * @param channels        音频通道个数
     */
    void onFrame(byte[] data, int length, int sampleRateHz, int channels);
}

示例代码:

//获取某个需要音频数据的成员对象
JRTCRoomParticipant participant = room.getParticipants().get(0);
//设置该成员音频数据回调
participant.setAudioOutputFrameCallback(new AudioOutputFrameCallback() {
    void onFrame(byte[] data, int length, int sampleRateHz, int channels) {
        //该成员音频数据
    }
});