音效与伴音
更新时间: 2024/03/15 17:20:44
在音视频通话或直播场景中,默认情况下只有房间成员本人说话的人声。出于烘托气氛、营造多样化语音环境的需求,NERTC SDK 支持通过混音功能播放多个掌声、口哨等短时音效,或者为人声添加背景音乐、伴奏音乐或其他场景效果,并将合成后的声音播放给房间内其他成员。
功能概述
混音,指 SDK 从 App 获取一路音频数据,将 App 提供的音频数据与 SDK 采集的音频数据整合为一路音频数据,通常用于音乐直播、在线KTV、连麦PK、游戏直播等场景。
NERTC SDK 提供混音相关方法,实现播放短时音效和背景音乐的功能。
-
播放短时音效:
指通话或直播中播放短时音频文件,一般用于渲染房间气氛,例如游戏音效、掌声、口哨、欢呼声、笑声的短时音效。支持多个音效叠加播放。
-
播放背景音乐:
伴音功能支持在房间中播放本地或者在线音乐文件,作为通话或直播时的背景声音,同时让房间内的其他人听到此音乐。NERTC 播放伴音方法可以用来播放比较长的背景音,例如伴奏音乐、环境白噪声、背景音乐等等。
NERTC SDK 混音功能支持如下设置:
-
混音:支持将音乐文件的音频流跟麦克风采集的音频流(主流)进行叠加并编码发送给对方,同时伴音功能支持通过辅流通道传输音乐文件的音频流。
-
循环:可以设置是否循环播放混音文件,以及循环次数。
-
音量控制:可以各自控制本地播放以及编码发送的混音音量。
-
音调控制:可以按伴音音阶调整本地播放的音乐文件的音调。例如在 K 歌场景中,为了使歌曲更适合主播的声线音域,主播可以调整伴音的音调,升高或降低伴奏的音阶。
-
定位:混音任务支持从背景音乐文件的任意位置开始播放。
-
叠加:可以同时播放多个短时音效文件。
注意事项
- 伴音相关方法的返回值若小于 0,表示方法调用失败。
- 请在加入房间成功后再启动混音任务。
- 本地混音文件支持 MP3、M4A、AAC、3GP、WMA、WAV 格式,支持本地文件和在线 URL。
- 可通过
OnAudioMixingStateChanged
回调接收音乐文件播放状态改变的相关信息,如果播放出错,可通过对应错误码排查故障。
配置音效
配置步骤
-
调用
PlayEffect
方法播放指定effectId
的音效文件。调用此方法时,您需要设置option
参数指定播放的音效文件。相关参数的含义如下。path
:指定音效文件的路径,例如D:\\audio_files\\test.mp3
。支持本地绝对路径或 URL 地址。effectId
:指定音效文件的 ID。loopCount
:指定音效文件循环播放的次数。默认值为 1,即默认仅播放一次;若该值小于等于0,则默认为无限循环播放。sendEnabled
:是否将音效发送至远端。该参数的默认值为 YES,即远端用户可以听到该音效。sendVolume
:音效文件的发送音量。该参数的取值范围为 0 ~ 100,默认值为 100,表示使用文件的原始音量。playbackEnabled
:是否本地播放该音效。默认为 YES,即本地用户可以听到该音效。playbackVolume
:音效文件的播放音量。该参数的取值范围为 0 ~ 100,默认值为 100,表示使用文件的原始音量。
- 您可以多次调用此方法以同时播放多个音效文件,实现音效的叠加。
- 在调用此方法成功播放指定音效文件后,若您反复停止再重新播放该
effectId
对应的音效文件,首次播放时设置的option
无效,会恢复为默认值。
-
音效播放任务管理。开始播放音效后,您还可以通过其他方法实现音效播放任务管理等更多功能,例如:
-
进度管理:调用
PauseAllEffects
方法暂停播放所有音效、调用ResumeAllEffects
方法恢复播放所有音效、调用SetEffectPosition
方法设置音效文件的播放位置等,此外也可以通过注册OnAudioEffectTimestampUpdate
回调以监听音效文件的实时播放进度。 -
音量管理:调用
SetEffectSendVolume
方法设置音效文件发送音量、调用SetEffectPlaybackVolume
方法设置音效文件播放音量。 -
音调管理:调用
SetEffectPitch
方法并通过pitch
参数设置音效文件的音调。- 仅开始播放音效文件后可调用此方法;播放结束后,音调将恢复为默认值。
- 音调
pitch
参数的取值范围为 [-12,12],默认值为 0,每相邻两个值的音调高度相差半音;取值的绝对值越大,音调升高或降低得越多。 - 若 SDK 返回 30003,表示参数设置错误;若 SDK 返回 30005,表示引擎尚未初始化或未找到当前音效文件。
-
获取混音相关信息:调用
GetEffectSendVolume
方法获取音效文件发送音量、调用GetEffectPlaybackVolume
方法获取音效文件播放音量等。
-
-
在离开房间前,调用
StopAllEffects
方法结束播放所有音效。
示例代码
C#uint effectId = 0;//音效唯一ID,需要自己指定
//播放音效
private void playEffect()
{
// 调用 playEffect 播放指定的音效文件
var option = new RtcCreateAudioEffectOption
{
path = "/path/to/file", //e.g. D:/tes.mp3
loopCount = 1,
sendEnabled = true,
playbackEnabled = true,
sendVolume = 100,
playbackVolume = 100,
streamType = RtcAudioStreamType.kNERtcAudioStreamTypeMain,
startTimestamp = 0,
progressInterval = 1000,
};
int result = rtcEngine.PlayEffect(effectId, option);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
}
//调整音量
private void setEffectVolume()
{
//设置发送音量
int result = rtcEngine.SetEffectSendVolume(effectId, 90);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
//设置播放音量
result = rtcEngine.SetEffectPlaybackVolume(effectId, 90);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
}
//停止播放音效
private void stopEffect()
{
int result = rtcEngine.StopEffect(effectId);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
}
//停止所有音效
private void stopAllEffects()
{
int result = rtcEngine.StopAllEffects();
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
}
API 参考
方法 | 功能描述 |
---|---|
PlayEffect |
播放指定音效文件 |
StopEffect |
停止播放指定音效文件 |
PauseEffect |
暂停播放指定音效文件 |
ResumeEffect |
恢复播放指定音效文件 |
StopAllEffects |
停止播放所有音效文件 |
PauseAllEffects |
暂停播放所有音效文件 |
ResumeAllEffects |
恢复播放所有音效文件 |
GetEffectSendVolume |
获取音效文件的发送音量 |
SetEffectPitch |
设置音效的音调 |
GetEffectPitch |
获取音效的音调 |
事件 | 事件描述 |
---|---|
OnAudioEffectFinished |
本地音效文件播放已结束回调 |
配置伴音
配置步骤
- 初始化伴音配置类,通过
RtcCreateAudioMixingOption
设置伴音任务相关参数,例如伴音文件路径、是否本地播放、是否通过辅流通道传输等等。 - 加入房间成功后,调用
StartAudioMixing
方法开始伴音。 - 伴音任务管理。开始伴音后,还可以通过其他方法实现伴音任务管理等更多功能,例如:
-
进度管理: 调用
PauseAudioMixing
和ResumeAudioMixing
方法暂停或恢复伴音、调用SetAudioMixingPosition
设置伴音文件的播放进度。 -
音量管理:调用
SetAudioMixingPlaybackVolume
和SetAudioMixingSendVolume
等方法设置伴音的播放音量、伴音的发送音量。 -
音调管理:调用
SetAudioMixingPitch
方法并通过pitch
参数设置伴音文件的音调。- 仅开始伴音后可调用此方法;伴音结束后,音调将恢复为默认值。
- 音调
pitch
参数的取值范围为 [-12,12],默认值为 0,每相邻两个值的音调高度相差半音;取值的绝对值越大,音调升高或降低得越多。 - 若 SDK 返回 30003,表示参数设置错误;若 SDK 返回 30005,表示引擎尚未初始化或未找到当前伴音文件。
-
获取伴音相关信息:例如通过
GetAudioMixingCurrentPosition
等接口获取伴音文件的播放进度等。
-
- 在离开房间前调用
StopAudioMixing
方法结束伴音。
示例代码
C#//开启伴音
private void startAudioMixing()
{
// 调用 playEffect 播放指定的音效文件
var option = new RtcCreateAudioMixingOption
{
path = "D:\\audioFiles\\test.mp3",
loopCount = 1,
sendEnabled = true,
playbackEnabled = true,
sendVolume = 100,
playbackVolume = 100,
streamType = RtcAudioStreamType.kNERtcAudioStreamTypeMain,
startTimestamp = 0,
progressInterval = 1000,
};
//开启伴音
int result = rtcEngine.StartAudioMixing(option);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
}
//获取当前播放进度
private void GetAudioMixingCurrentPosition()
{
//获取总时长
ulong duration = 0;
int result = rtcEngine.GetAudioMixingDuration(ref duration);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
//获取当前播放位置
ulong currentPostion = 0;
result = rtcEngine.GetAudioMixingCurrentPosition(ref currentPostion);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
}
//调整伴音音量
private void setAudioMixingVolume()
{
//设置发送音量
uint sendVolume = 90;
int result = rtcEngine.SetAudioMixingSendVolume(sendVolume);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
//获取发送音量
result = rtcEngine.GetAudioMixingSendVolume(ref sendVolume);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
//设置播放音量
uint playbackVolume = 90;
result = rtcEngine.SetAudioMixingPlaybackVolume(playbackVolume);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
//获取播放音量
result = rtcEngine.GetAudioMixingPlaybackVolume(ref playbackVolume);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
}
//停止播放音效
private void stopAudioMixing()
{
int result = rtcEngine.StopAudioMixing();
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
}
API参考
方法 | 功能描述 |
---|---|
StartAudioMixing |
开始播放伴音 |
StopAudioMixing |
停止播放伴音 |
PauseAudioMixing |
暂停播放伴音 |
ResumeAudioMixing |
恢复播放伴音 |
SetAudioMixingPlaybackVolume |
设置伴音播放音量 |
SetAudioMixingSendVolume |
设置伴音的发送音量 |
GetAudioMixingPlaybackVolume |
获取伴音的播放音量 |
GetAudioMixingSendVolume |
获取伴音的发送音量 |
GetAudioMixingDuration |
获取伴音的总长度 |
SetAudioMixingPosition |
设置伴音的播放进度 |
GetAudioMixingCurrentPosition |
获取伴音当前播放进度 |
SetAudioMixingPitch |
设置伴音的音调 |
GetAudioMixingPitch |
获取伴音的音调 |
事件 | 事件描述 |
---|---|
OnAudioMixingStateChanged |
伴音播放状态改变回调 |
OnAudioMixingTimestampUpdate |
伴音播放进度回调 |