在实时音视频互动过程中,为烘托气氛、增添趣味性,用户通常需要播放音效或音乐文件并且让频道内所有用户都听到。例如,在游戏中添加打斗声,在唱歌时添加伴奏。声网提供两组独立的方法,你可以分别实现播放音效和音乐文件。
声网在 GitHub 上提供已实现播放音效和音乐文件功能的开源示例项目。你可以下载体验并参考源代码。
本文提到的音效是指持续时间短的氛围音,例如掌声、欢呼声、打斗声、枪击声等,通常多个音效可以叠加使用。
声网提供一组方法播放和管理音效文件,主要包括如下功能:
参考如下步骤实现播放音效文件:
preloadEffect
方法预加载本地音效文件。playEffect
方法播放音效文件。当音效文件播放完成时,SDK 会触发 rtcEngineDidAudioEffectFinish
回调。在播放音效文件前,你需要设置 filePath
和 soundId
指定音效文件。两个参数的含义如下:
filePath
: 音效文件路径,支持本地或在线文件路径。SDK 会在该路径中查找音效文件。soundId
: 音效 ID,由你自行定义,具有唯一性。SDK 会根据音效 ID 来识别音效文件。常见的音效 ID 定义方法有自增 ID、使用音效文件名的 hashCode 等。// 设置音效 ID。
int EFFECT_ID = 1;
// 设置音效文件路径。
NSString *filePath = "your filepath";
// 设置音效 ID。
let EFFECT_ID:Int32 = 1
// 设置音效文件路径。
let filePath = "your filepath"
SDK 支持预加载功能,你可以将音效文件提前加载到内存,以提高性能。预加载不是一个必须的步骤,声网建议你按需选择。
如需加载多个音效文件,你需要多次调用 preloadEffect
。
preloadEffect
需要在加入频道前调用。preloadEffect
后,音效文件会一直占用内存,直至调用 unloadEffect
或者离开频道。// 将指定的本地音效文件预加载至内存。
[agoraKit preloadEffect: EFFECT_ID filePath: filePath];
// 释放预加载的音效文件。
[agoraKit unloadEffect: EFFECT_ID];
// 将指定的本地音效文件预加载至内存。
agoraKit.preloadEffect(EFFECT_ID, filePath: filePath)
// 释放预加载的音效文件。
agoraKit.unloadEffect(EFFECT_ID)
调用 playEffect
播放音效文件。根据需求,你可以多次调用 playEffect
同时播放多个音效文件。在播放音效文件时,你可以设置循环次数、音调、音量、播放位置等。
playEffect
需要在加入频道后调用。// 设置音效循环播放的次数。-1 表示无限循环。
int loopCount = 1;
// 设置的音效的音调。取值范围为 [0.5, 2.0]。1.0 表示原始音调。
double pitch = 1;
// 设置的音效空间位置。取值范围为 [-1.0,1.0]。
// -1.0 表示音效出现在左边;0 表示音效出现在正前方;1 表示音效出现在右边。
double pan = 1;
// 设置音量。取值范围为 [0.0,100.0],100.0 表示原始音量。
double gain = 100.0;
// 设置是否将音效发布至远端。true 表示本地用户和远端用户都能听到音效;false 表示只有本地用户能听到音效。
BOOL publish = true;
// 设置音效文件的播放位置。500 表示从音效文件的第 500 ms 开始播放。
int startPos = 500;
// 播放指定的音效文件。
[agoraKit playEffect: EFFECT_ID filePath: filePath loopCount: loopCount pitch: pitch pan: pan gain: gain publish: publish startPos: startPos];
// 本地音效文件播放已结束回调。
- (void)rtcEngineDidAudioEffectFinish:(AgoraRtcEngineKit* _Nonnull)engine EFFECT_ID;
// 设置音效循环播放的次数。-1 表示无限循环。
let loopCount = 1
// 设置的音效的音调。取值范围为 [0.5, 2.0]。1.0 表示原始音调。
let pitch = 1
// 设置的音效空间位置。取值范围为 [-1.0,1.0]。
// -1.0 表示音效出现在左边;0 表示音效出现在正前方;1 表示音效出现在右边。
let pan = 1
// 设置音量。取值范围为 [0.0,100.0],100.0 表示原始音量。
let gain = 100.0
// 设置是否将音效发布至远端。true 表示本地用户和远端用户都能听到音效;false 表示只有本地用户能听到音效。
let publish = true
// 设置音效文件的播放位置。500 表示从音效文件的第 500 ms 开始播放。
let startPos = 500;
// 播放指定的音效文件。
agoraKit.playEffect(EFFECT_ID, filePath: filePath, loopCount: Int32(loopCount), pitch: pitch, pan: pan, gain: gain, publish: publish, startPos: startPos)
// 本地音效文件播放已结束回调。
func rtcEngineDidAudioEffectFinish(_ engine: AgoraRtcEngineKit, EFFECT_ID) {
}
成功播放后,你可以停止播放指定或全部的音效文件。
// 停止播放指定的音效文件。
[agoraKit stopEffect: EFFECT_ID];
// 停止播放所有音效文件。
[agoraKit stopAllEffects];
// 停止播放指定的音效文件。
agoraKit.stopEffect(EFFECT_ID)
// 停止播放所有音效文件。
agoraKit.stopAllEffects()
在音效文件播放时,你可以暂停或恢复播放指定或全部音效文件。
playEffect
后调用。// 暂停播放指定的音效文件。
[agoraKit pauseEffect: EFFECT_ID];
// 暂停播放所有的音效文件。
[agoraKit pauseAllEffects];
// 恢复播放指定的音效文件。
[agoraKit resumeEffect: EFFECT_ID];
// 恢复播放所有的音效文件。
[agoraKit resumeAllEffects];
// 暂停播放指定的音效文件。
agoraKit.pauseEffect(EFFECT_ID)
// 暂停播放所有的音效文件。
agoraKit.pauseAllEffects()
// 恢复播放指定的音效文件。
agoraKit.resumeEffect(EFFECT_ID)
// 恢复播放所有的音效文件。
agoraKit.resumeAllEffects()
如需在播放音效文件后调整播放位置,你可以调用本组方法。例如,在循环播放音效文件期间,你可以调用本组方法调整播放位置,无需停止播放。
getEffectDuration
需要在加入频道后调用,本组其他方法需要在 playEffect
后调用。// 获取指定本地音效文件的总时长。
[agoraKit getEffectDuration: filePath: filePath];
// 设置指定音效文件的播放位置。500 表示从音效文件的第 500 ms 开始播放。
[agoraKit setEffectPosition: EFFECT_ID pos: 500];
// 获取指定音效文件的播放进度。
[agoraKit getEffectCurrentPosition: EFFECT_ID];
// 获取指定本地音效文件的总时长。
agoraKit.getEffectDuration(filePath: filePath)
// 设置指定音效文件的播放位置。500 表示从音效文件的第 500 ms 开始播放。
agoraKit.setEffectPosition(EFFECT_ID, pos: 500)
// 获取指定音效文件的播放进度。
agoraKit.getEffectCurrentPosition(EFFECT_ID)
在音效文件开始播放后,你可以调用本组方法调节播放音量。例如,在循环播放音效文件期间,你可以调用本组方法调节播放音量,无需停止播放。
playEffect
后调用。// 设置所有音效文件的播放音量。取值范围为 [0.0,100.0],100.0 表示原始音量。
[agoraKit setEffectsVolume: volume: 50.0];
// 设置指定音效文件的播放音量。取值范围为 [0.0,100.0],100.0 表示原始音量。
[agoraKit setVolumeOfEffect: EFFECT_ID volume: 50.0];
// 获取音效文件的播放音量。音量范围为 [0.0,100.0],100.0 表示原始音量。
[agoraKit getEffectsVolume];
// 设置所有音效文件的播放音量。取值范围为 [0.0,100.0],100.0 表示原始音量。
agoraKit.setEffectsVolume(volume: 50.0)
// 设置指定音效文件的播放音量。取值范围为 [0.0,100.0],100.0 表示原始音量。
agoraKit.setVolumeOfEffect(EFFECT_ID, volume: 50.0)
// 获取音效文件的播放音量。音量范围为 [0.0,100.0],100.0 表示原始音量。
agoraKit.getEffectsVolume()
preloadEffect
unloadEffect
playEffect
stopEffect
stopAllEffects
pauseEffect
pauseAllEffects
resumeEffect
resumeAllEffects
getEffectDuration
setEffectPosition
getEffectCurrentPosition
setEffectsVolume
setVolumeOfEffect
getEffectsVolume
rtcEngineDidAudioEffectFinish
音乐混音是指将音乐文件与麦克风采集的音频混合。使用混音功能的用户通常会播放比较长的音乐文件,并且同一时间只播放一个音乐文件。例如,在唱歌时播放伴奏,在聊天时播放背景音乐。
声网提供一组方法播放和管理音乐文件,主要包括如下功能:
成功调用 startAudioMixing
后,当音乐文件播放状态发生改变时,SDK 会触发 localAudioMixingStateDidChanged
回调。
调用 startAudioMixing
播放音乐文件。在播放音乐文件时,可以设置循环次数、播放位置等。
startAudioMixing
,则 SDK 会自动停止播放上一个音乐文件并开始播放下一个音乐文件。// 设置音乐文件路径。
NSString *filePath = @"your file path";
// 设置是否只在本地播放音乐文件。true 表示只有本地用户能听到音乐;false 表示本地用户和远端用户都能听到音乐。
BOOL loopback = NO;
// 设置是否用音乐文件替换麦克风采集的音频。true 表示用户只能听到音乐;false 表示用户可以听到音乐和麦克风采集的音频。
BOOL replace = NO;
// 设置音乐文件的播放次数。1 表示播放 1 次。
NSInteger cycle = 1;
// 设置音乐文件的播放位置。500 表示从音乐文件的第 500 ms 开始播放。
NSInteger startPos = 500;
// 开始播放混音。
[agoraKit startAudioMixing: filePath loopback: loopback replace: replace cycle: cycle startPos: startPos];
// 本地音乐文件播放状态已改变回调。
- (void)rtcEngine:(AgoraRtcEngineKit* _Nonnull)engine localAudioMixingStateDidChanged:(AgoraAudioMixingStateCode)state reason:(AgoraAudioMixingReasonCode)reason;
// 设置音乐文件路径。
let filePath = "your file path"
// 设置是否只在本地播放音乐文件。true 表示只有本地用户能听到音乐;false 表示本地用户和远端用户都能听到音乐。
let loopback = false
// 设置是否用音乐文件替换麦克风采集的音频。true 表示用户只能听到音乐;false 表示用户可以听到音乐和麦克风采集的音频。
let replace = false
// 设置音乐文件的播放次数。1 表示播放 1 次。
let cycle = 1
// 设置音乐文件的播放位置。500 表示从音乐文件的第 500 ms 开始播放。
let startPos = 500
// 开始播放混音
agoraKit.startAudioMixing(filePath, loopback: loopback, replace: replace, cycle: cycle, startPos: startPos)
// 本地音乐文件播放状态已改变回调
func rtcEngine(_ engine: AgoraRtcEngineKit, localAudioMixingStateDidChanged state: AgoraAudioMixingStateCode, reason: AgoraAudioMixingReasonCode) {
}
成功播放音乐文件后,你可以调用 stopAudioMixing
停止播放。
// 停止播放音乐文件。
[agoraKit stopAudioMixing];
// 停止播放音乐文件。
agoraKit.stopAudioMixing()
在音乐文件播放时,你可以暂停或恢复播放音乐文件。
startAudioMixing
后调用。// 暂停播放音乐文件。
[agoraKit pauseAudioMixing];
// 恢复播放音乐文件。
[agoraKit resumeAudioMixing];
// 暂停播放音乐文件。
agoraKit.pauseAudioMixing()
// 恢复播放音乐文件。
agoraKit.resumeAudioMixing()
在音乐文件播放时,你可以调用本组方法调整音乐文件的播放位置,无需停止播放。
startAudioMixing
并收到 localAudioMixingStateDidChanged(AgoraAudioMixingStatePlaying)
回调后调用。// 获取当前音乐文件的总时长。
[agoraKit getAudioMixingDuration];
// 设置当前音乐文件的播放位置。500 表示从音乐文件的第 500 ms 开始播放。
[agoraKit setAudioMixingPosition: pos: 500];
// 获取当前音乐文件的播放位置。
[agoraKit getEffectCurrentPosition];
// 获取当前音乐文件的总时长。
agoraKit.getAudioMixingDuration()
// 设置当前音乐文件的播放位置。500 表示从音乐文件的第 500 ms 开始播放。
agoraKit.setAudioMixingPosition(pos: 500)
// 获取当前音乐文件的播放位置。
agoraKit.getEffectCurrentPosition()
成功播放音乐文件后,你可以调用本组方法调整音乐文件的播放音量与音调,无需停止播放。
startAudioMixing
并收到 localAudioMixingStateDidChanged(AgoraAudioMixingStatePlaying)
回调后调用。// 调节当前音乐文件在本地和远端的播放音量。取值范围为 [0,100],100 表示原始音量。
[agoraKit adjustAudioMixingVolume: volume: 50];
// 调节当前音乐文件在远端的播放音量。取值范围为 [0,100],100 表示原始音量。
[agoraKit adjustAudioMixingPublishVolume: volume: 50];
// 调节当前音乐文件在本地的播放音量。取值范围为 [0,100],100 表示原始音量。
[agoraKit adjustAudioMixingPlayoutVolume: volume: 50];
// 获取当前音乐文件在本地的播放音量。音量范围为 [0,100],100 表示原始音量。
[agoraKit getAudioMixingPlayoutVolume];
// 获取当前音乐文件在远端的播放音量。音量范围为 [0,100],100 表示原始音量。
[agoraKit getAudioMixingPublishVolume];
// 调节当前音乐文件的音调。取值范围为 [-12,12],0 表示原始音调,1 表示升高一个半音。
[agoraKit setAudioMixingPitch: pitch: 5];
// 调节当前音乐文件在本地和远端的播放音量。取值范围为 [0,100],100 表示原始音量。
agoraKit.adjustAudioMixingVolume(volume: 50)
// 调节当前音乐文件在远端的播放音量。取值范围为 [0,100],100 表示原始音量。
agoraKit.adjustAudioMixingPublishVolume(volume: 50)
// 调节当前音乐文件在本地的播放音量。取值范围为 [0,100],100 表示原始音量。
agoraKit.adjustAudioMixingPlayoutVolume(volume: 50)
// 获取当前音乐文件在本地的播放音量。音量范围为 [0,100],100 表示原始音量。
agoraKit.getAudioMixingPlayoutVolume()
// 获取当前音乐文件在远端的播放音量。音量范围为 [0,100],100 表示原始音量。
agoraKit.getAudioMixingPublishVolume()
// 调节当前音乐文件的音调。取值范围为 [-12,12],0 表示原始音调,1 表示升高一个半音。
agoraKit.setAudioMixingPitch(pitch: 5)
成功播放音乐文件后,你可以调用 setAudioMixingPlaybackSpeed
设置当前音乐文件的播放速度。
startAudioMixing
并收到 localAudioMixingStateDidChanged(AgoraAudioMixingStatePlaying)
回调后调用。//声网推荐取值范围为 [50,400]。其中,50 表示 0.5 倍速,100 表示原始速度,400 表示 4 倍速。
[agoraKit setAudioMixingPlaybackSpeed: speed: 50];
//声网推荐取值范围为 [50,400]。其中,50 表示 0.5 倍速,100 表示原始速度,400 表示 4 倍速。
agoraKit.setAudioMixingPlaybackSpeed(speed: 50)
成功播放音乐文件后,你可以调用本组方法设置音乐文件的播放音轨。
startAudioMixing
并收到 localAudioMixingStateDidChanged(AgoraAudioMixingStatePlaying)
回调后调用。// 获取当前音乐文件的音轨数量。
[agoraKit getAudioTrackCount];
// 指定音乐文件的音轨进行播放。指定音轨的索引取值范围为 [0, getAudioTrackCount())。
[agoraKit selectAudioTrack: index: 2];
// 获取当前音乐文件的音轨数量。
agoraKit.getAudioTrackCount()
// 指定音乐文件的音轨进行播放。指定音轨的索引取值范围为 [0, getAudioTrackCount())。
agoraKit.selectAudioTrack(index: 2)
成功播放音乐文件后,你可以调用 setAudioMixingDualMonoMode
设置音乐文件的如下声道模式:
AgoraAudioMixingDualMonoAuto
: 原始模式。AgoraAudioMixingDualMonoL
: 左声道模式。该模式用左声道的音频替换右声道的音频,即用户只能听到左声道的音频。AgoraAudioMixingDualMonoR
: 右声道模式。该模式用右声道的音频替换左声道的音频,即用户只能听到右声道的音频。AgoraAudioMixingDualMonoMix
: 混合模式。该模式将左右声道的数据叠加,即用户能同时听到左声道和右声道的音频。startAudioMixing
并收到 localAudioMixingStateDidChanged(AgoraAudioMixingStatePlaying)
回调后调用。[agoraKit setAudioMixingDualMonoMode: AgoraAudioMixingDualMonoAuto];
agoraKit.setAudioMixingDualMonoMode(.auto)
startAudioMixing
stopAudioMixng
pauseAudioMixing
resumeAudioMixing
getAudioMixingDuration
setAudioMixingPosition
getAudioMixingCurrentPosition
adjustAudioMixingVolume
adjustAudioMixingPublishVolume
adjustAudioMixingPlayoutVolume
getAudioMixingPlayoutVolume
getAudioMixingPublishVolume
setAudioMixingPitch
setAudioMixingPlaybackSpeed
getAudioTrackCount
selectAudioTrack
setAudioMixingDualMonoMode
localAudioMixingStateDidChanged
当播放音乐文件时,你还可以参考如下文档: