# 音频管理
Juphoon 音视频能力平台及终端的媒体引擎支持音频质量保障能力,Juphoon RTC SDK 提供视频通话过程中访客端实现音频管理的功能。
# 发送本地音频流
通话中的成员可通过调用 enableUploadAudioStream (opens new window) 方法来开启关闭发送本地音频流。
/**
* 开启/关闭发送本地音频流
*
* 通话中调用该方法可开启或关闭发送本地音频流。开启后,通话中的成员将听见本端声音;关闭后,频道成员将听不见本端声音 <br>
* 通话中调用此方法成功后,服务器会更新状态并同步给通话中所有成员,即所有成员会收到 {@link JRTCCallCallback#onParticipantUpdate onParticipantUpdate} 回调,具体可关注 {@link JRTCRoomParticipant#audio audio} 和 {@link JRTCRoomParticipant#audio audio} <br>
* 通话中调用此方法不影响接收其他成员的音频流
* @param enable 开启/关闭发送本地音频流
* - true: 开启,即发送本地音频流
* - false: 关闭,即不发送本地音频流
* @return 接口调用结果
* - true: 接口调用成功
* - false: 接口调用异常
*/
public abstract enableUploadAudioStream(enable: boolean): boolean;
- 在多方通话中,enableUploadAudioStream (opens new window) 的作用是开启或关闭发送本地音频流。开启后,房间成员将听见本端声音;关闭后,房间成员将听不见本端声音。房间中调用此方法不影响接收远端音频。
- 初始化 JRTCCall (opens new window) 时,默认不发送本地音频流。若要加入房间时让房间内其他成员听见本端声音,需要在调用 join (opens new window) 加入房间前设置,或者在JRTCCallJoinParam 设置。
- 房间中调用此方法开启或关闭发送本地音频流,服务器会更新状态并同步给其他房间成员同时,房间中的其他成员会收到该成员“是否上传音频“的状态变化回调 onParticipantUpdate (opens new window)。
- 此外,此方法还可以实现开启或关闭静音的功能。当 enable 值为 false ,将会停止发送本地音频流,此时其他成员将听不到您的声音,从而实现静音功能。
/**
* 成员更新回调
*
* @param participant 成员对象
* @param changeParam 更新标识类
*/
onParticipantUpdate?: (participant: JRTCRoomParticipant, changeParam: JRTCRoomParticipantChangeParam) => void;
示例代码:
// 关闭音频流发送
call.enableUploadAudioStream(false);
// 开启音频流发送
call.enableUploadAudioStream(true);
// 成员属性更新回调
onParticipantUpdate:(participant: JRTCRoomParticipant, changeParam: JRTCRoomParticipantChangeParam) => {
if(changeParam.audio){
// 成员音频上传状态发生改变
if(participant.audio){
// 该成员音频流打开
} else{
// 该成员音频流关闭
}
}
}
# 音频输出
/**
* 开启/关闭音频输出
* <p>
* - 该方法可实现本地静音功能。关闭时听不到房间内其他成员的声音,不影响其他成员;开启时可以听到其他成员声音
* - 初始化 JRTCRoom 时,音频输出功能默认是开启的。若要加入房间时听不见其他成员的声音,建议在调用 {@link #join join} 加入房间前设置
*
* @param enable 是否开启音频输出
* - true: 开启音频输出
* - false: 关闭音频输出
* @return 接口调用结果
* - true: 接口调用成功,会收到 {@link JRTCCallCallback#onCallPropertyChanged onCallPropertyChange} 回调
* - false: 接口调用异常
*/
public abstract enableAudioOutput(enable: boolean): boolean;
- 该方法可实现本地静音功能。关闭时听不到房间内其他成员的声音,不影响其他成员;开启时可以听到其他成员声音。
- 初始化 JRTCCall (opens new window) 时,音频输出功能默认是开启的。若要加入房间时听不见其他成员的声音,建议在调用 join (opens new window) 加入房间前设置。
- 该方法可以关闭或重新开启音频输出功能,在房间内和房间外均可调用,且在离开房间后该设置仍然有效,也就是说这一次设置了关闭音频输出,那么下一次加入房间时也是默认关闭音频输出。
/**
* 通话属性改变,重点关注屏幕共享
*
* @param propChangeParam 通话改变的属性
*/
onCallPropertyChanged?: (propChangeParam: JRTCRoomPropChangeParam) => void;
示例代码:
// 关闭音频输出
call.enableAudioOutput(false);
// 开启音频输出
call.enableAudioOutput(true);
// 房间属性变化回调
onCallPropertyChanged:(changeParam: PropChangeParam) => {
/**
* 输出声音状态是否变化
* - true: 变化
* - false: 没变化
*/
if (changeParam.audioOutput) {
}
}
# 自定义音频输入
通话中可以自定义从外部音频文件作为音频源输入,使用场景举例:比如共享本地音频。
/**
* 开始/结束播放本地音频文件作为音频源输入
* @note 如果用户正在通话中,该音频将播放到通话内,通话中所有成员包括自己都能听到
*
* @param { boolean } enable 开始或者结束
* @param { string } filePath 音频文件路径,支持pcm,wav的格式(需要单声道,采样率16K音频文件)
* @param { boolean } loop 是否循环播放
* @note 重复调用会覆盖
* @return { boolean } 接口调用结果
* - true: 接口调用成功
* - false: 接口调用异常
*/
public abstract enableAudioInputFromFile(enable: boolean, filePath: string, loop: boolean): boolean;
/**
* 暂停/继续播放语音文件作为音频源输入
*
* @param { boolean } suspend
* - true:暂停播放
* - false:继续播放
* @return { boolean } 调用是否正常
* - true:正常执行调用流程
* - false:调用异常
*/
public abstract suspendAudioInputFromFile(suspend: boolean): boolean;
音频输入播放结束(非循环播放结束或者主动停止播放),会收到 JRTCMediaDeviceCallback (opens new window) 的onFileAudioInputDidFinish (opens new window) 回调通知
/**
* 本地文件音频源输入完成回调
*/
onFileAudioInputDidFinish?: () => void;
示例代码
// 开始分享本地文件音频输入到通话内
mediaDevice.enableAudioInputFromFile(true, "/sdcard/1.pcm", true);
mediaDevice.enableAudioInputFromFile(false, "", true);
onFileAudioInputFinish():void {
// 分享本地文件音频输入到通话结束
}
# 本地音频播放
通话中可以播放一段本地音频,使用场景举例:比如播放来电铃声。
/**
* 开始播放音频
* @note 不管是否在通话中,该音频播放只有本地可以听到
*
* - 当播放音频文件完成后会收到 {@link JRTCMediaDeviceCallback#onRingPlayFinish() onRingPlayFinish} 回调通知
* @param { string } filePath 音频文件路径,支持pcm,wav的格式(需要单声道,采样率16K音频文件)
* @param { boolean } isLoop 是否循环播放
* @return { boolean } 接口调用结果
* - true: 接口调用成功
* - false: 接口调用异常
*/
public abstract startRing(filePath: string, isLoop: boolean): boolean;
/**
* 结束播放音频
*
* - 会收到 {@link JRTCMediaDeviceCallback#onRingPlayFinish() onRingPlayFinish} 回调通知
* @return { boolean } 接口调用结果
* - true: 接口调用成功
* - false: 接口调用异常
*/
public abstract stopRing(): boolean;
音频播放结束会收到 JRTCMediaDeviceCallback (opens new window) 的 onRingPlayFinish (opens new window) 回调通知
/**
* 音频播放完成
*/
onRingPlayFinish?: () => void;
示例代码:
mediaDevice.startRing("/sdcard/1.pcm", true);
// 结束播放本地音频
mediaDevice.stopRing();
onRingPlayFinish:() => {
// 本地音频播放结束
}
# 音频异常回调
通过实现 JRTCMediaDeviceCallback (opens new window) 的 onAudioError (opens new window) 接口监听音频异常回调,具体错误查看参数 error 描述。
/**
* 音频异常
*
* @param { string } error 异常信息
*/
onAudioError?: (error: string) => void;
# 音频数据回调
获取音频数据建议创建worker线程接收回调数据

# 输入音频数据回调
/**
* 设置音频输入数据回调
* @note 因为回调数据比较频繁,建议创建独立的Worker线程调用该接口
* 当Worker线程结束时,内部会自动清除回调,也可以手工设置null来主动删除回调
* setAudioInputFrameCallback(null)
*
* @param callback 全局唯一的回调函数,回调参数说明如下:
* @param { string } inputId 输入源的自定义字符串
* @param { number } sampleRateHz 输入源的采样频率
* @param { number } channels 输入源的频道数量
* @param { ArrayBuffer } data 该帧的采样数据
* @return { boolean }
* -true 设置成功
* -false 设置失败
*/
export function setAudioInputFrameCallback(callBack: ((inputId: string, sampleRateHz: number, channels: number, data: ArrayBuffer) => void) | null): boolean
示例代码
//主线程
let worker: worker.ThreadWorker = new worker.ThreadWorker("子线程文件路径");
worker.postMessage({"option":"StartInput"})
worker.postMessage({"option":"StopInput"})
//子线程
workerPort.onmessage = (e: MessageEvents) => {
if (e.data.option as string == "StartInput"){
setAudioInputFrameCallback((inputId: string, sampleRateHz: number, channels: number, data: ArrayBuffer) => {
//具体操作
});
}else if(e.data.option as string == "StopInput"){
setAudioInputFrameCallback(null);
}
}
# 输出音频数据回调
/**
* 设置音频输出数据回调
* @note 因为回调数据比较频繁,建议创建独立的Worker线程调用该接口
* 当Worker线程结束时,内部会自动清除回调,也可以手工设置null来主动删除回调
* setAudioOutputFrameCallback(null)
*
* @param callback 全局唯一的回调函数,回调参数说明如下:
* @param { string } inputId 输入源的自定义字符串
* @param { number } sampleRateHz 输入源的采样频率
* @param { number } channels 输入源的频道数量
* @param { ArrayBuffer } data 该帧的采样数据
* @return { boolean }
* -true 设置成功
* -false 设置失败
*/
export function setAudioOutputFrameCallback(callBack: ((inputId: string, sampleRateHz: number, channels: number, data: ArrayBuffer) => void) | null): boolean
示例代码
//主线程
let worker: worker.ThreadWorker = new worker.ThreadWorker("子线程文件路径");
worker.postMessage({"option":"StartOutput"})
worker.postMessage({"option":"StopOutput"})
//子线程
workerPort.onmessage = (e: MessageEvents) => {
if (e.data.option as string == "StartOutput"){
setAudioOutputFrameCallback((inputId: string, sampleRateHz: number, channels: number, data: ArrayBuffer) => {
//具体操作
});
}else if(e.data.option as string == "StopOutput"){
setAudioOutputFrameCallback(null);
}
}
