浅谈 Android 娱乐直播/游戏特殊音效如何实现
1 功能简介
我们在直播中,为了增强真实感,烘托场景氛围需要播放的简短效果音。例如:掌声、笑声、礼物音效、提示音等。在游戏中,有时也需要播放子弹声、碰撞打击声等。
ZegoExpress SDK 提供音效文件播放器,通过 ZegoAudioEffectPlayer 统一管理音效,支持音效播放(可以多音效重叠播放)、播放控制(如暂停播放、音量调节、设置播放进度)、预加载音效等功能。
2 支持格式
音效文件播放器支持播放 MP3、M4A、AAC、WAV 格式的本地音频文件。
3 示例源码下载
请参考 下载示例源码 获取源码。
相关源码请查看 “/ZegoExpressExample/AdvancedAudioProcessing/src/main/java/im/zego/advancedaudioprocessing/audioeffectplayer” 目录下的文件。
4 前提条件
在实现音效文件播放器功能之前,请确保:
- 已在项目中集成 ZEGO Express SDK,实现基本的实时音视频功能,详情请参考 快速开始 - 集成 和 快速开始 - 实现流程。
- 已在 ZEGO 控制台 创建项目,并申请有效的 AppID,详情请参考 控制台 - 项目管理 中的“项目信息”。
5 使用步骤
5.1 创建音效播放器
调用 ZegoExpressEngine 的 createAudioEffectPlayer 方法创建音效播放器实例。
引擎当前只支持同时创建一个实例,超出后将返回 null。
ZegoAudioEffectPlayer audioEffectPlayer = ZegoExpressEngine.getEngine().createAudioEffectPlayer();
5.2 播放控制
5.2.1 (可选)为音效播放器设置事件回调
音效播放器事件回调设置
可以根据需要调用音效播放器的 setEventHandler 方法为播放器设置事件回调,用于监听“音效播放状态改变”等通知。
audioEffectPlayer.setEventHandler(new IZegoAudioEffectPlayerEventHandler() {
@Override
public void onAudioEffectPlayStateUpdate(ZegoAudioEffectPlayer audioEffectPlayer, int audioEffectID, ZegoAudioEffectPlayState state, int errorCode) {
Log.d("[ZEGO]", "onAudioEffectPlayStateUpdate errorCode:" + errorCode + " audioEffectID:" + audioEffectID + " state:" + state);
}
});
5.2.2 开始播放
调用 start 方法播放音效,目前仅支持同时播放 12 个,且只能为本地文件,不支持播放网络资源。 “audioEffectID” 需要保持全局唯一。
- 如果已通过
loadResource方法预先加载了音效,则只需要传入预加载时的 “audioEffectID”,“path”(音效资源的路径)字段传空即可。 - 若需要重复播放可以通过
ZegoAudioEffectPlayConfig中 “playCount” 配置重复次数。如果设置为 “0”,则表示无限重复播放,直到用户手动调用stop停止。
int audioEffectID = 1;
ZegoAudioEffectPlayConfig config = new ZegoAudioEffectPlayConfig();
config.playCount = 10;
config.isPublishOut = true;
audioEffectPlayer.start(audioEffectID,"/storage/emulated/0/Android/data/im.zego.express.example.video/files/3-s.mp3",config);
5.2.3 暂停/恢复/停止播放
- 调用
pause方法可以暂停播放 “audioEffectID” 指定的音效,调用pauseAll方法则暂停所有正在播放的音效。 - 音效暂停播放后,调用
resume方法可以恢复播放 “audioEffectID” 指定的音效,调用resumeAll方法则恢复所有已暂停音效。 - 调用
stop方法可以停止播放 “audioEffectID” 指定的音效,调用stopAll方法则停止播放所有音效。
audioEffectPlayer.pause(audioEffectID);
audioEffectPlayer.resume(audioEffectID);
audioEffectPlayer.stop(audioEffectID);
audioEffectPlayer.pauseAll();
audioEffectPlayer.resumeAll();
audioEffectPlayer.stopAll();
5.2.4 调节音量
- 调用
setVolume方法可以设置 “audioEffectID” 指定的音效音量,取值范围为 [0, 200],默认值为 “100”。 - 调用
setVolumeAll方法则同时设置所有音效音量,取值范围为 [0, 200],默认值为 “100”。
int volume =70;
audioEffectPlayer.setVolume(audioEffectID, volume);
// 设置所有音效的音量
audioEffectPlayer.setVolumeAll(volume);
5.2.5 播放进度控制
- 调用
getTotalDuration方法获取单个音效的总时长。 - 调用
getCurrentProgress方法获取音效当前播放进度。 - 调用
seekTo方法可以根据需要设置播放进度。
// 获取音效的总时长
long totalDuration = audioEffectPlayer.getTotalDuration(audioEffectID);
// 获取音效当前播放进度
long progress = audioEffectPlayer.getCurrentProgress(audioEffectID);
// 设置播放进度
audioEffectPlayer.seekTo(audioEffectID, 1, new IZegoAudioEffectPlayerSeekToCallback() {
@Override
public void onSeekToCallback(int errorCode) {
Log.d("[ZEGO]", "onSeekToCallback errorCode:" + errorCode);
}
});
5.3 (可选)预加载资源
预加载资源
在频繁播放相同音效场景中,SDK 为了优化重复读文件并解码的性能,提供了预加载音效文件到内存中的功能。
调用 loadResource 方法加载音效资源,可通过 “callback” 参数来监听加载的结果,显示加载成功后方可播放。最多支持同时预加载 15 个本地音效文件(不支持网络资源),并且单个音效文件时长不能超过 30 s,否则加载会报错。
当加载的音效使用完成后,可以调用 unloadResource 接口卸载,以释放相关资源。否则 SDK 将在 ZegoAudioEffectPlayer 实例释放时会自动卸载已加载的音效。
预加载为非必须操作,为了提高性能或者需要反复播放某个特定的音效时推荐使用。
// 加载音效资源
audioEffectPlayer.loadResource(audioEffectID, "/storage/emulated/0/Android/data/im.zego.express.example.video/files/3-s.mp3", new IZegoAudioEffectPlayerLoadResourceCallback() {
@Override
public void onLoadResourceCallback(int i) {
Log.d("[ZEGO]", "onLoadResourceCallback errorCode:" + i );
}
});
// 卸载音效资源
audioEffectPlayer.unloadResource(audioEffectID);
5.4 销毁媒体播放器
使用完音效播放器后,需要及时调用 destroyAudioEffectPlayer 方法销毁,释放该播放器占用的资源。
engine.destroyAudioEffectPlayer(audioEffectPlayer);
6 API 参考列表
| 方法 | 描述 |
|---|---|
createAudioEffectPlayer |
创建音效播放器实例 |
setEventHandler |
设置音效播放器回调 |
start |
播放音效 |
pause |
暂停播放单个音效 |
pauseAll |
暂停播放所有音效 |
resume |
恢复播放单个音效 |
resumeAll |
恢复播放所有音效 |
stop |
停止播放单个音效 |
stopAll |
停止播放所有音效 |
setVolume |
调节音效音量 |
setVolumeAll |
调节所有音效音量 |
getTotalDuration |
控制播放进度 |
getCurrentProgress |
获取当前播放进度 |
seekTo |
设置指定的播放进度 |
loadResource |
预加载资源 |
unloadResource |
卸载资源 |
destroyAudioEffectPlayer |
销毁音效播放器实例 |
7 音效播放器与媒体播放器有什么区别?
- 媒体播放器主要用于播放视频及较长的音乐,支持播放网络资源。同一时间最多支持创建 4 个播放器实例,一个实例只能播放一个音视频。
- 音效播放器主要用于播放时间较短的音效,不支持播放网络资源。同一时间只支持创建一个音效播放器实例,音效播放器支持多路音效并发播放,一个实例最多同时播放 12 个音效。
获取Demo
获取本文的Demo、开发文档、技术支持。
获取SDK的商务活动、热门产品。
注册即构ZEGO开发者帐号,快速开始。
浅谈 Android 娱乐直播/游戏特殊音效如何实现的更多相关文章
- 浅谈Android应用保护(一):Android应用逆向的基本方法
对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...
- 安卓开发_浅谈Android动画(四)
Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1. ValueAnimator 基本属 ...
- 浅谈Android应用性能之内存
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...
- 浅谈Android五大布局
Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...
- [转]浅谈Android五大布局(二)——RelativeLayout和TableLayout
在浅谈Android五大布局(一)中已经描述了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoulteLayout(绝对布局)三种布局结构,剩下的两种布局Relati ...
- [转]浅谈Android五大布局(一)——LinearLayout、FrameLayout和AbsoulteLayout
Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...
- 浅谈Android Studio3.0更新之路(遇坑必入)
>可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...
- 浅谈android代码保护技术_ 加固
浅谈android代码保护技术_加固 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结果被人反编译了,那心情真心不舒服.虽然我们混淆,做到native层,但 ...
- 浅谈Android保护技术__代码混淆
浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元 ...
- 浅谈Android编码规范及命名规范
前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 ...
随机推荐
- Mac玩家的武侠梦:燕云十六声全平台运行保姆级教程
M系列Mac凭借Apple Silicon芯片的强劲性能,已实现燕云十六声等大型手游的原生运行.通过开源工具PlayCover,开发者社区成功打通武侠动作游戏的跨平台壁垒,让玩家在Mac设备上感受沉浸 ...
- codeup之C语言10.10
Description 给定字符串定义char *a = "I love China!",读入整数n,输出在进行了a = a + n这个赋值操作以后字符指针a对应的字符串. Inp ...
- Median of Two Sorted Arrays---LeetCode进阶路④
题目描述 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of th ...
- E - Stamp
题目链接 : E - Stamp (atcoder.jp) 题意:给定长为n的s串,m的t串,和一个长度为n的x串,问你能否操作任意次数的操作, 每次操作都可以使x中长度为m的存在串变为t,最后使得变 ...
- Spring Boot中使用注解实现简单工厂模式
前言 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂模式(Simple Factory Pattern),但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出接 ...
- 「Log」做题记录 2023.8.28-2023.9.24
\(2023.8.28-2023.9.3\) \(\color{blueviolet}{P3704}\) 莫反. \(\color{limegreen}{P8773}\) ST 表. \(\color ...
- 如何基于three.js(webgl)引擎架构,实现3D密集架库房,3D档案室智能巡检
前言: 看了一下 距离上篇课程发布,一年多了.这一年多来也迷茫,也怀疑,在AI时代,是不是失去了写文章的意义了.切身感受到那种面对科技浪潮时的迷茫和无力感.当AI能写出流畅.结构清晰的文章,甚至模 ...
- 5-Dataloader使用
1. Dataloader使用 ① Dataset只是去告诉我们程序,我们的数据集在什么位置,数据集第一个数据给它一个索引0,它对应的是哪一个数据. ② Dataloader就是把数据加载到神经网络当 ...
- 在centos7等旧版linux上用国内源下载源码编译安装gcc并配置环境变量
原文永久链接:https://forum.piwind.com/d/23-zai-centos7deng-jiu-ban-linuxshang-yong-guo-nei-yuan-xia-zai-yu ...
- FastAPI中的敏感数据如何在不泄露的情况下翩翩起舞?
扫描二维码 关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ 以下是关于FastAPI框架中敏 ...