功能描述
在通话或直播过程中,除了用户自己说话的声音,有时候需要播放自定义的声音或者音乐文件并且让频道内的其他人也听到,比如需要给游戏添加音效,或者需要播放背景音乐等,AR 提供以下两组方法可以满足播放音效和音乐文件的需求。
开始前请确保已在你的项目中实现基本的实时音视频功能。
播放音效文件
音效通常指持续很短的音频。播放音效文件方法主要用来播放短小的氛围音,比如鼓掌、游戏子弹撞击声音等,可以多个音效叠加播放,且音效文件可以预加载以提高性能。
AR SDK 提供 AudioEffectManager
类统一管理音效,包含一些管理音效的常用方法。 音效由音频文件路径指定,但在 AudioEffectManager
内部使用 sound id 来识别和处理音效。音效文件通常保存在 assets 文件夹下;SDK 并不强制如何定义 sound id,保证每个音效有唯一的识别即可。一般的做法有自增 id,使用音效文件名的 hashCode 等。
实现方法
示例代码
override fun getEffectsVolume(callback: Callback) {
callback.resolve(engine) { it.audioEffectManager.effectsVolume }
}
override fun setEffectsVolume(params: Map<String, *>, callback: Callback) {
callback.code(engine?.audioEffectManager?.setEffectsVolume((params["volume"] as Number).toDouble()))
}
override fun setVolumeOfEffect(params: Map<String, *>, callback: Callback) {
callback.code(engine?.audioEffectManager?.setVolumeOfEffect((params["soundId"] as Number).toInt(), (params["volume"] as Number).toDouble()))
}
override fun playEffect(params: Map<String, *>, callback: Callback) {
callback.code(engine?.audioEffectManager?.playEffect((params["soundId"] as Number).toInt(), params["filePath"] as String, (params["loopCount"] as Number).toInt(), (params["pitch"] as Number).toDouble(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble(), params["publish"] as Boolean))
}
override fun stopEffect(params: Map<String, *>, callback: Callback) {
callback.code(engine?.audioEffectManager?.stopEffect((params["soundId"] as Number).toInt()))
}
override fun stopAllEffects(callback: Callback) {
callback.code(engine?.audioEffectManager?.stopAllEffects())
}
override fun preloadEffect(params: Map<String, *>, callback: Callback) {
callback.code(engine?.audioEffectManager?.preloadEffect((params["soundId"] as Number).toInt(), params["filePath"] as String))
}
override fun unloadEffect(params: Map<String, *>, callback: Callback) {
callback.code(engine?.audioEffectManager?.unloadEffect((params["soundId"] as Number).toInt()))
}
override fun pauseEffect(params: Map<String, *>, callback: Callback) {
callback.code(engine?.audioEffectManager?.pauseEffect((params["soundId"] as Number).toInt()))
}
override fun pauseAllEffects(callback: Callback) {
callback.code(engine?.audioEffectManager?.pauseAllEffects())
}
override fun resumeEffect(params: Map<String, *>, callback: Callback) {
callback.code(engine?.audioEffectManager?.resumeEffect((params["soundId"] as Number).toInt()))
}
override fun resumeAllEffects(callback: Callback) {
callback.code(engine?.audioEffectManager?.resumeAllEffects())
}
override fun setAudioSessionOperationRestriction(params: Map<String, *>, callback: Callback) {
callback.code(-Constants.ERR_NOT_SUPPORTED)
}
API 参考
getAudioEffectManager
开发注意事项
- 预加载不是一个必须的步骤,一般来说为了提高性能或者需要反复播放某个特定的音效的时候,我们建议使用预加载。但如果音效文件比较大,不建议预加载。
- 以上方法都有返回值,返回值小于 0 表示方法调用失败。
音乐混音
混音是指播放本地或者在线音乐文件,同时让频道内的其他人听到此音乐。混音方法主要用来播放比较长的背景音,比如直播的时候播放的音乐,同时只可以有一个文件播放。如果在混音播放第一个文件的过程中播放第二个文件,会自动停止第一个文件的播放。
AR 混音功能支持如下设置:
- 混音或替换: 混音指的是音乐文件的音频流跟麦克风采集的音频流进行混音(叠加)并编码发送给对方;替换指的是麦克风采集的音频被音乐文件的音频流替换掉,对方只能听见音乐播放。
- 循环:可以设置是否循环播放混音文件,以及循环次数。
- 调节音量:可以同时或分别调节音乐文件在本地和远端的播放音量。
- 调节音调:可以分别调节本地人声的音调和音乐文件的音调。
开发注意事项
- 混音要求安卓系统版本 4.2 以上、API Level 至少为 16。
- 在频道内调用混音方法,否则会有潜在问题。
- 若运行在模拟器中,混音只能播放位于 /sdcard/ 下的 mp3 文件。
- 以上方法都有返回值。返回值小于 0 表示方法调用失败。