音效,主要指为了增强真实感或者烘托场景氛围播放的简短效果音。例如:在直播期间,经常会有一些播放音效的场景,如掌声、礼物音效、提示音等。在游戏中,有时也需要播放子弹声、碰撞打击声等。
ZEGO Express SDK 提供的音效文件播放器(ZegoAudioEffectPlayer),统一管理音效,支持音效播放(可以多音效重叠播放)、播放控制(如暂停播放、音量调节、设置播放进度)、音效预加载等功能。
音效文件播放器支持播放 MP3、M4A、AAC、WAV 格式的本地音频文件。
请参考 下载示例源码 获取源码。
相关源码请查看 “/ZegoExpressExample/Examples/AdvancedAudioProcessing/AudioEffectPlayer” 目录下的文件。
调用 IZegoExpressEngine 的 createAudioEffectPlayer 方法创建音效播放器实例。
引擎当前只支持同时创建一个实例,超出后将返回 null。
IZegoAudioEffectPlayer* audioEffectPlayer = engine->createAudioEffectPlayer();
if (audioEffectPlayer == nullptr) {
printf("创建音效播放器失败");
}
在频繁播放相同音效场景中,SDK 为了优化重复读文件并解码的性能,提供了预加载音效文件到内存中的功能。
调用 loadResource 方法加载音效资源,可通过 callback
参数来监听加载的结果,显示加载成功后方可播放。最多支持同时预加载 15 个本地音效文件(不支持网络资源),并且单个音效文件时长不能超过 30s,否则加载会报错。
当加载的音效使用完成后,可以调用 unloadResource 接口卸载,以释放相关资源。否则 SDK 将在 IZegoAudioEffectPlayer 实例释放时会自动卸载已加载的音效。
预加载为非必须操作,为了提高性能或者需要反复播放某个特定的音效时推荐使用。
// 加载音效资源
audioEffectPlayer->loadResource(audioEffectID, "D:/soundEffectSample.mp3", [](int errorCode){
printf("loadResource result=%s", errorCode==0? "succeed", "failed");
});
// 卸载音效资源
audioEffectPlayer->unloadResource(audioEffectID);
可以根据需要调用音效播放器的 setEventHandler 方法为播放器设置事件回调,用于监听音效播放状态改变
等通知。
class MyAudioEffectPlayerEventHandler: public IZegoAudioEffectPlayerEventHandler{
public:
// 播放器播放某音效的状态变更回调
void onAudioEffectPlayStateUpdate(IZegoAudioEffectPlayer* audioEffectPlayer, unsigned int audioEffectID, ZegoAudioEffectPlayState state, int errorCode) override{
printf("effect %d : currentState=%d, errorCode=%d", audioEffectID, state, errorCode);
}
}
auto eventHandler = std::make_shared<MyAudioEffectPlayerEventHandler>();
audioEffectPlayer->setEventHandler(eventHandler);
调用 start 方法播放音效,目前仅支持同时播放 12 个,且只能为本地文件,不支持播放网络资源。 audioEffectID
需要保持全局唯一。
audioEffectID
,path
(音效资源的路径) 字段传空即可。playCount
配置重复次数。如果设置为 0,则表示无限重复播放,直到用户手动调用 stop 停止。ZegoAudioEffectPlayConfig config;
config.repeatCount = 1;
config.isPublishOut = false;
audioEffectPlayer->start(audioEffectID, "D:/soundEffectSample.mp3", &config);
// 暂停播放
audioEffectPlayer->pause(audioEffectID);
// 恢复播放
audioEffectPlayer->resume(audioEffectID);
// 停止播放
audioEffectPlayer->stop(audioEffectID);
// 暂停播放所有音效
audioEffectPlayer->pauseAll();
// 恢复播放所有音效
audioEffectPlayer->resumeAll();
// 停止播放所有音效
audioEffectPlayer->stopAll();
// 设置音量
audioEffectPlayer->setVolume(audioEffectID, volume);
// 设置所有音效的音量
audioEffectPlayer->setVolumeAll(volume);
// 获取音效的总时长
auto totalDuration = audioEffectPlayer->getTotalDuration(audioEffectID);
// 获取音效当前播放进度
auto currentProgress = audioEffectPlayer->getCurrentProgress(audioEffectID);
// 设置播放进度
audioEffectPlayer->seekTo(audioEffectID, total / 2, [](int errorCode){
printf("seekTo result=%s", errorCode==0? "succeed", "failed");
});
使用完音效播放器后,需要及时调用 destroyAudioEffectPlayer 方法销毁,释放该播放器占用的资源。
engine->destroyAudioEffectPlayer(audioEffectPlayer);
音效播放器与媒体播放器有什么区别?
播放器类型 | 区别 |
---|---|
媒体播放器 |
主要用于播放视频及较长的音乐,支持播放网络资源。同一时间最多支持创建 4 个播放器实例,一个实例只能播放一个音视频。 |
音效播放器 |
主要用于播放时间较短的音效,不支持播放网络资源。同一时间只支持创建一个音效播放器实例,音效播放器支持多路音效并发播放,一个实例最多同时播放 15 个音效。 |
联系我们
文档反馈