iOS直播/游戏怎么利用特殊音效制造娱乐效果?
1 功能简介
我们在直播中,为了增强真实感,烘托场景氛围需要播放的简短效果音。例如:掌声、笑声、礼物音效、提示音等。在游戏中,有时也需要播放子弹声、碰撞打击声等。
ZegoExpress SDK 提供音效文件播放器,通过 ZegoAudioEffectPlayer 统一管理音效,支持音效播放(可以多音效重叠播放)、播放控制(如暂停播放、音量调节、设置播放进度)、预加载音效等功能。
2 支持格式
音效文件播放器支持播放 MP3、M4A、AAC、WAV 格式的本地音频文件。
3 示例源码下载
请参考 下载示例源码 获取源码。
相关源码请查看 “/ZegoExpressExample/Examples/AdvancedAudioProcessing/AudioEffectPlayer” 目录下的文件。
4 前提条件
在实现音效文件播放器功能之前,请确保:
- 已在项目中集成 ZEGO Express SDK,实现基本的实时音视频功能,详情请参考 快速开始 - 集成 和 快速开始 - 实现流程。
- 已在 ZEGO 控制台 创建项目,并申请有效的 AppID,详情请参考 控制台 - 项目管理 中的“项目信息”。
5 使用步骤
5.1 创建音效播放器
调用 ZegoExpressEngine 的 createAudioEffectPlayer 方法创建音效播放器实例。
引擎当前只支持同时创建一个实例,超出后将返回 nil。
@property (nonatomic, strong) ZegoAudioEffectPlayer *audioEffectPlayer;
self.audioEffectPlayer = [[ZegoExpressEngine sharedEngine] createAudioEffectPlayer];
if (!self.audioEffectPlayer) {
NSLog(@"创建音效播放器失败");
}
5.2 播放控制
5.2.1 (可选)为音效播放器设置事件回调
音效播放器事件回调设置
可以根据需要调用音效播放器的 setEventHandler 方法为播放器设置事件回调,用于监听“音效播放状态改变”等通知。
[self.audioEffectPlayer setEventHandler:self];
- (void)audioEffectPlayer:(ZegoAudioEffectPlayer *)audioEffectPlayer audioEffectID:(unsigned int)audioEffectID playStateUpdate:(ZegoAudioEffectPlayState)state errorCode:(int)errorCode {
NSLog(@"Play state update. ID:%d, state:%lu, err:%d", audioEffectID, (unsigned long)state, (int)errorCode);
}
5.2.2 开始播放
调用 start 方法播放音效,目前仅支持同时播放 12 个,且只能为本地文件,不支持播放网络资源。 其中 “audioEffectID” 需要保持全局唯一。
- 如果已通过
loadResource方法预先加载了音效,则只需要传入预加载时的 “audioEffectID”,“path”(音效资源的路径)字段传空即可。 - 若需要重复播放可以通过
ZegoAudioEffectPlayConfig中 “playCount” 配置重复次数。如果设置为 “0”,则表示无限重复播放,直到用户手动调用stop停止。
// 此处示例获取已存放于 App Bundle 内的 test.wav 资源
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"wav"];
ZegoAudioEffectPlayConfig *config = [[ZegoAudioEffectPlayConfig alloc] init];
config.playCount = 1; // 播放一次
config.isPublishOut = YES; // 播放混入推流中
// 使用 0 作为此次的 audioEffectID
[self.audioEffectPlayer start:0 path:filePath config:config];
5.2.3 暂停/恢复/停止播放
- 调用
pause指定的音效,调用pauseAll方法则暂停所有正在播放的音效。 - 音效暂停播放后,调用
resume方法可以恢复播放 “audioEffectID” 指定的音效,调用resumeAll方法则恢复所有已暂停音效。 - 调用
stop指定的音效,调用stopAll方法则停止播放所有音效。
// 暂停 0 号 audioEffectID 资源的播放
[self.audioEffectPlayer pause:0];
// 恢复 0 号 audioEffectID 资源的播放
[self.audioEffectPlayer resume:0];
// 停止 0 号 audioEffectID 资源的播放
[self.audioEffectPlayer stop:0];
// 暂停所有资源的播放
[self.audioEffectPlayer pauseAll];
// 恢复所有资源的播放
[self.audioEffectPlayer resumeAll];
// 停止所有资源的播放
[self.audioEffectPlayer stopAll];
5.2.4 调节音量
- 调用
setVolume方法可以设置 “audioEffectID” 指定的音效音量,取值范围为 [0, 200],默认值为 “100”。 - 调用
setVolumeAll方法则同时设置所有音效音量,取值范围为 [0, 200],默认值为 “100”。
// 设置 0 号 audioEffectID 的音量为 100
[self.audioEffectPlayer setVolume:100 audioEffectID:0];
// 设置所有资源的音量为 100
[self.audioEffectPlayer setVolumeAll:100];
5.2.5 播放进度控制
- 调用
getTotalDuration方法获取单个音效的总时长。 - 调用
getCurrentProgress方法获取音效当前播放进度。 - 调用
seekTo方法可以根据需要设置播放进度。
// 获取 0 号 audioEffectID 的总时长
unsigned long long totalDuration = [self.audioEffectPlayer getTotalDuration:0];
// 获取 0 号 audioEffectID 的当前播放进度
unsigned long long currentProgress = [self.audioEffectPlayer getCurrentProgress:0];
// 设置 0 号 audioEffectID 的播放进度为总进度的一半
[self.audioEffectPlayer seekTo:(unsigned long long)(totalDuration / 2) audioEffectID:0 callback:^(int errorCode) {
NSLog(@"seekTo result: %d", errorCode);
}];
5.3 (可选)预加载资源
预加载资源
在频繁播放相同音效场景中,SDK 为了优化重复读文件并解码的性能,提供了预加载音效文件到内存中的功能。
调用 loadResource 方法加载音效资源,可通过 “callback” 参数来监听加载的结果,显示加载成功后方可播放。最多支持同时预加载 15 个本地音效文件(不支持网络资源),并且单个音效文件时长不能超过 30 s,否则加载会报错。
当加载的音效使用完成后,可以调用 unloadResource 接口卸载,以释放相关资源。否则 SDK 将在 ZegoAudioEffectPlayer 实例释放时会自动卸载已加载的音效。
预加载为非必须操作,为了提高性能或者需要反复播放某个特定的音效时推荐使用。
// 此处示例获取已存放于 App Bundle 内的 test.wav 资源
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"wav"];
[self.audioEffectPlayer loadResource:filePath audioEffectID:0 callback:^(int errorCode) {
NSLog(@"loadResource result, errorCode: %d", errorCode);
}];
5.4 销毁媒体播放器
使用完音效播放器后,需要及时调用 destroyAudioEffectPlayer 方法销毁,释放该播放器占用的资源。
[[ZegoExpressEngine sharedEngine] destroyAudioEffectPlayer:self.audioEffectPlayer];
6 API 参考列表
| 方法 | 描述 |
|---|---|
createAudioEffectPlayer |
创建音效播放器实例 |
setEventHandler |
设置音效播放器回调 |
start |
播放音效 |
pause |
暂停播放单个音效 |
pauseAll |
暂停播放所有音效 |
resume |
恢复播放单个音效 |
resumeAll |
恢复播放所有音效 |
stop |
停止播放单个音效 |
stopAll |
停止播放所有音效 |
setVolume |
调节音效音量 |
setVolumeAll |
调节所有音效音量 |
getTotalDuration |
控制播放进度 |
getCurrentProgress |
获取当前播放进度 |
seekTo |
设置指定的播放进度 |
loadResource |
预加载资源 |
unloadResource |
卸载资源 |
destroyAudioEffectPlayer |
销毁音效播放器实例 |
7 音效播放器与媒体播放器有什么区别?
- 媒体播放器主要用于播放视频及较长的音乐,支持播放网络资源。同一时间最多支持创建 4 个播放器实例,一个实例只能播放一个音视频。
- 音效播放器主要用于播放时间较短的音效,不支持播放网络资源。同一时间只支持创建一个音效播放器实例,音效播放器支持多路音效并发播放,一个实例最多同时播放 12 个音效。
获取更多支持
获取本文的Demo、开发文档、技术支持。
获取SDK的商务活动、热门产品。
注册即构ZEGO开发者帐号,快速开始。
iOS直播/游戏怎么利用特殊音效制造娱乐效果?的更多相关文章
- iOS cocos2d游戏引擎的了解之一
ios游戏引擎之Cocos2d(一) cocos2d是一个免费开源的ios游戏开发引擎,并且完全采用object-c进行编写,这对于已经用惯object-c进行ios应用开发的童鞋来说非常容易上手.这 ...
- iOS音频采集过程中的音效实现
1.背景 在移动直播中, 声音是主播和观众互动的重要途径之一, 为了丰富直播的内容,大家都会想要在声音上做一些文章, 在采集录音的基础上玩一些花样. 比如演唱类的直播间中, 主播伴随着背景音乐演唱. ...
- 【如何快速的开发一个完整的iOS直播app】(美颜篇)
原文转自:袁峥Seemygo 感谢分享.自我学习 前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,美颜功能是很重 ...
- 【如何快速的开发一个完整的iOS直播app】(原理篇)
原文转自:袁峥Seemygo 感谢分享.自我学习 目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的 ...
- iOS 直播类APP开发流程分解:
1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机:CCD.C ...
- 【如何快速的开发一个完整的iOS直播app】(推流篇)
前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,肯定需要流媒体服务器,本篇主要讲解直播中流媒体服务器搭建,并且讲解了如 ...
- 【如何快速的开发一个完整的 iOS 直播 app】(美颜篇)
来源:袁峥Seemygo 链接:http://www.jianshu.com/p/4646894245ba 前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播 ...
- 如何快速的开发一个完整的iOS直播app(原理篇)
目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的iOS直播app](采集篇) 前言 大半年没写博客了,但 ...
- 【如何快速的开发一个简单的iOS直播app】(代码篇)
开篇([如何快速的开发一个完整的iOS直播app](原理篇)) 好久没写简书,因为好奇的我跑去学习直播了,今天就分享一下我的感慨. 目前为止直播还是比较热点的技术的,简书,git上有几篇阅读量和含金量 ...
- iOS - 直播总结(理论到实践)
一.直播原理及流程 1.一个完整直播app原理 直播原理:把主播录制的视频,推送到服务器,在由服务器分发给观众观看. 直播环节:推流端(采集.美颜处理.编码.推流).服务端处理(转码.录制.截图.鉴黄 ...
随机推荐
- Git 中的“撤销”
(1)当commit 完后,发现少add几个文件,可以: $ git commit -m 'initial commit' $ git add forgotten_file $ git commit ...
- Win32汇编学习笔记07.筛选器异常
Win32汇编学习笔记07.筛选器异常-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 钢琴 od调试老师给的多媒体钢琴 运行找到Piano的过程函数里去 找到处理 ...
- 炸裂!Spring AI 1.0 正式发布,让 Java 再次伟大!
炸裂,炸裂,炸裂!从第一次提交代码到现在,经过 2 年的沉淀,Spring AI 框架的第一个正式版本 1.0 终于发布了. 有了这玩意,开发 AI 应用就是洒洒水的事,Java 开发者们是不是又爽了 ...
- AI面试助手面试精灵重磅发布“双栏模式”:极速和精准可以兼得
引言 面试中的每一秒都至关重要,许多求职者反馈:面对面试官的犀利提问,要么因"卡壳"错失良机,要么因追求准确而延误回答时机.作为以顶级GPT为核心的AI面试助手,面试精灵始终致力于 ...
- SparkSQL编程需注意的细节
SparkSQL是把Hive转为字符串后,以参数形式传递到SparkSession.builder().enableHiveSupport().getOrcCreate().sql(Hive_Stri ...
- 论文解读:Aging with GRACE: Lifelong Model Editing with Discrete Key-Value Adapters
论文发表于人工智能顶会NeurIPS(原文链接).当前的模型编辑器会因多次编辑损害模型性能,提出用于连续编辑的通用检索适配器(General Retrieval Adapters for Cont ...
- P1155 [NOIP 2008 提高组] 双栈排序
将一组数据分成两组,且组内不能冲突.考虑使用二分图. 我们来思考什么样的两个数不能存在于一个栈中.因为最后要求我们升序排序输出,所以在一个栈中的数字必定是降序. 那么当 \(i<j\) 时并且 ...
- 指标+AI+BI:构建数据分析新范式丨2024袋鼠云秋季发布会回顾
10月30日,袋鼠云成功举办了以"AI驱动,数智未来"为主题的2024年秋季发布会.大会深度探讨了如何凭借 AI 实现新的飞跃,重塑企业的经营管理方式,加速数智化进程. 作为大会的 ...
- DRF之分页类源码分析
DRF之分页类源码分析 [一]分页类介绍 Django REST framework(DRF)是一个用于构建Web API的强大工具,它提供了分页功能,使你能够控制API响应的数据量. 在DRF中,分 ...
- STL:迭代器与常用算法
迭代器 C++ STL(Standard Template Library,标准模板库)中迭代器与常用算法是泛型编程的核心组成部分.它们配合使用,可以对容器进行高效.统一的操作.下面是对它们的系统性总 ...