从零开始Android游戏编程(第二版) 第十二章 音乐与音效

java数字音频最强教程之如何检测一段音频中是否有声音 声音检测 随着人工智能的发展,机器视觉,机器可视化也变的越来越完善,但是声音这块分析资料却比较少,有时候需要去检测一段视频或者音频中是否有声音。在某些场景中需要判断有声音则抓拍录制,当然这里只是先初步检测声音响度,如果还需要更高深的检测比如有人说话,也有其他嘈杂声音,我们如何去区分是人在说话,还是车开过,还是噪音,这个以后再讲。 可用于流媒体视频中实时检测,也可以用于离线文件检测,根据自己的需求,调节soundThreshold阈值,一般情况-65 db 为安静状态。 演示: 话不多说,直接上代码: pa 阅读详情
第十二章 音乐与音效

广告说的好“没有声音再好的戏也出不来”,下面就让我们为程序加入声音效果。

一般情况下,游戏中的声音分为音乐和音效两个部分。直观上的区别,音乐播放的时间较长,资源文件较大。音效播放时间较短,资源文件比较小。在Android中,我们使用两种不同的方法播放音乐和音效。

播放音乐需要用到MediaPlayer类,MediaPlayer本身比较复杂,这里我们只做一个简单的介绍,满足播放音乐的基本要求即可,读者可以参考帮助文档中的内容深入研究。

为了调用方便,我们创建一个Util类,将播放背景音乐的方法封装到Util中

public class Util {

static MediaPlayer mp;

static void playBGM(String path, boolean looping) {

if(mp == null) {

mp = new MediaPlayer();

}

mp.reset();

try {

mp.setDataSource(path);

mp.prepare();

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalStateException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

mp.setLooping(looping);

mp.start();

}

}

让我们分析一下这段代码:首先,我们需要一个MediaPlayer实例,然后重置MediaPlayer到Idle状态。注意,这个操作是必需的,如果当前正在播放,不重置状态直接调用setDataSource会抛出异常。然后指定我们要播放的文件,并调用prepare方法进行准备。如果你想指定开始时间(seekTo)必须在prepare之后进行。还可以设定是否循环,最后就是调用start播放了。

封装好后,我们可以方便的使用这个函数,我们在SceneStartMenu中重载start方法

public void start(SurfaceHolder surfaceHolder){

Util.playBGM("/sdcard/sample.mid", false);

}

这样,程序运行后就开始播放音乐了。还要注意的是,我们应该在适当的时候释放MediaPlayer占用的资源。

运行一下编辑好的代码看看效果吧。sample.mid在res/raw目录下。

下面让我来学习如何播放音效,它将使用完全不同的方法SoundPool。SoundPool虽然是基于MediaPlayer的,但是他被优化用来同时播放多个文件,而且不适合播放较大的文件,可以说,他就是为播放音效定制的。下面就让我们看一下播放音效的代码:

private static int MAX_CHANNEL = 6;

private static SoundPool soundPool;

private static HashMap soundPoolMap;

private static AudioManager audioManager;

首先设定声道数,如果同时播放的音频超过这个数量,最先播放的音频就会被关闭。然后定义SoundPool变量。大家注意soundPoolMap这个变量,下面会重点讲解。

public static void playSE(String path, float volume, int loop, float rate) {

if(soundPool == null) {

soundPool = new SoundPool(MAX_CHANNEL, AudioManager.STREAM_MUSIC, 10);

}

if(soundPoolMap == null) {

soundPoolMap = new HashMap ();

}

if(!soundPoolMap.containsKey(path)) {

soundPoolMap.put(path, soundPool.load(path, 1));

}

这里我们要讲解一下soundPoolMap。在音频被播放前需要先将它载入到内存,载入后,会得到一个streamID,SoundPool中的很多函数都使用这个ID来控制特定的音频流。所以,我们将这个ID保存到map中,并与音频文件的路径相对应。后面就可以通过路径来找到这段音频流了。

if(volume < 0) {

if(audioManager == null)

audioManager = (AudioManager)Main.getInstance()

.getSystemService(Context.AUDIO_SERVICE);

volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

}

while(soundPool.play(soundPoolMap.get(path),

volume, volume, 0, loop, rate) == 0);

}

这个方法并不是很科学,最好还是在初始化的时候载入音频,大家可以另行撰写一个load方法。

public void playSE(String path) {

playSE(path, -1f, 0, 1f);

}

public void stopSE(String path) {

if(soundPool != null && soundPoolMap != null

&& soundPoolMap.containsKey(path)) {

soundPool.stop(soundPoolMap.get(path));

}

}

修改SceneStartMenu中的start函数测试一下吧

public void start(SurfaceHolder surfaceHolder){

// Util.playBGM("/sdcard/sample.mid", false);

Util.playSE("/sdcard/system11.ogg");

Util.playSE("/sdcard/system12.ogg");

}

现在,这部教程终于可以告一段落了,虽然有点虎头蛇尾,但我大概已经讲解了制作一个简单游戏所用到的各方面的知识。如果还有不足,请读者留言补充,大家互相学习,一起提高。最终我在教程中没有完成坦克大战,不过我会基于坦克大战设计一个新的游戏,不再使用Java,而是一个全新的跨平台框架,到时候再与大家分享我的心得。

本章示例程序 http://u.115.com/file/f1435ee7e8
Android游戏开发中的SoundPool音效优化实践 本文深入探讨了Android游戏开发中SoundPool音效的优化实践。通过对比MediaPlayer的局限性,详细介绍了SoundPool的创建、音效加载、多音效叠加播放与优先级管理策略。文章重点分享了预加载、内存管理(包括规避1MB限制)等核心性能优化技巧,并提供了应对复杂游戏场景的进阶方案,旨在帮助开发者实现低延迟、高性能的游戏音效体验。 阅读详情

相关推荐

Unity2D游戏音效系统架构设计:从ScriptableObject到对象池的实战优化

在游戏开发中,音频系统是提升玩家沉浸感的关键模块,其核心原理在于高效管理音频资源的加载、播放与混合。通过模块化设计,开发者可以实现音效的可控性与可维护性,其中ScriptableObject作为灵活的数据容器,能够将音频配置与逻辑代码解耦,便于团队协作。对象池技术则有效解决了频繁创建销毁AudioSource带来的性能开销,尤其适用于大量瞬发音效的场景。本文以Unity2D游戏为背景,深入探讨如何结合ScriptableObject与对象池构建健壮的音效系统,涵盖音频管理器、播放器池及配置数据的实战实现,帮

weixin_34124651的博客 371

【读书笔记《Android游戏编程之从零开始》】19.游戏开发基础(游戏音乐与音效)...

在一款游戏中,除了华丽的界面 UI 直接吸引玩家外,另外重要的就是游戏的背景音乐与音效;合适的背景音乐以及精彩的音效搭配会令整个游戏上升一个档次。 在 Android 中。常用于播放游戏背景音乐的类是 MediaPlayer, 而用于游戏音效的则是 SoundPool 类。 1. MediaPlayer MediaPlayer 实例化不是 new 出来的,而是通过调用静态方法...

216

安卓手机玩PS1游戏全攻略:DuckStation模拟器0.1-8675版汉化+BIOS配置指南

本文详细介绍了如何在安卓手机上使用DuckStation模拟器畅玩PS1经典游戏,包括模拟器安装、BIOS配置、游戏加载及性能优化等全流程指南。通过DuckStation的高兼容性和丰富设置,玩家可以完美重温《最终幻想7》《合金装备》等经典游戏,享受流畅的复古游戏体验。

weixin_28717431的博客 612

从零开始Android游戏编程(第二版) 目录

目录 前言... 3 第一版前言... 5 第一章 搭建开发环境... 6 第二章 创建第一个程序Hello Tank. 10 第三章 显示文字和图片... 17 第四章 响应用户事件... 30 第五章 小结——扫雷游戏的实现... 36 第六章 SurfaceView动画... 39 第七章 精灵、帧动画与碰撞检测... 46 第八章 地图的设计和实现... 62 第九章 游戏程序的生命周期... 75 第十章 游戏循环的设计... 85 第十一章 演员(Actor)、视口(V

老邢的专栏 4733

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

yang1067155909的专栏 4291

Hi3516CV610开发板实战:从零搭建智能视觉监控系统

本文详细介绍了从零开始基于Hi3516CV610开发板搭建智能视觉监控系统的完整实战流程。涵盖硬件连接、系统配置、摄像头集成、网络设置、固件烧录到视频处理与智能分析功能开发,提供了丰富的实践经验和调试技巧,帮助开发者快速掌握嵌入式视觉系统开发。

vvv99的博客 562

《Android游戏编程之从零开始》

《Android游戏编程之从零开始》   【读书笔记《Android游戏编程之从零开始》】20.游戏开发基础(游戏数据存储) 叶超Luka 2015-02-08 22:22 阅读:1415 评论:0   【读书笔记《Android游戏编程之从零开始》】19.游戏开发基础(游戏音乐与音效) 叶超Luka 2014-12-30 12:16 阅读:794 评

lulusayhi的博客 1228

集成电路模拟版图入门-版图基础学习笔记(四)

第三部分:版图的准备 2. 设计规则 3) Design Rule 2. 设计规则 4) 规则定义 4.1 NW(N WELL) 2. 设计规则 4) 规则定义 4.1 NW(N WELL) 2. 设计规则 4) 规则定义 4.2 PO(Poly) 2. 设计规则 4) 规则定义 4.3 M1(Metal1) 2. 设计规则 4) 规则定义 4.4 VIA 3. DRC文件 3.1 DRC:Design Rule Check,设计规则检查。 3.2 DRC程序了解有关

weixin_52955333的博客 6735

【读书笔记《Android游戏编程之从零开始》】19.游戏开发基础(游戏音乐与音效)

在一款游戏中,除了华丽的界面 UI 直接吸引玩家外,另外重要的就是游戏的背景音乐与音效;合适的背景音乐以及精彩的音效搭配会令整个游戏上升一个档次。 在 Android 中。常用于播放游戏背景音乐的类是 MediaPlayer, 而用于游戏音效的则是 SoundPool 类。   1. MediaPlayer MediaPlayer 实例化不是 new 出来的,而是通过调用静态方法得到的,这

今天的成功,是昨天换来的 844

宝骏kiwi 630 730 560 E100 E200 E300 310 510 610 330 530维修手册电路图资料线路图接线图更新

2020-2022年宝骏RS-3维修手册和电路图。2020-2022年宝骏RS-3维修手册和电路图。2019-2021年宝骏RC-6维修手册和电路图。2019-2021年宝骏RC-6维修手册和电路图。2019-2020年宝骏RS-5维修手册和电路图。2019-2020年宝骏RS-5维修手册和电路图。2019-2020年宝骏RM-5维修手册和电路图。2019-2020年宝骏RM-5维修手册和电路图。2019-2021年宝骏510维修手册和电路图。2019-2021年宝骏510维修手册和电路图。

weixin_45821055的博客 1771

扰动观察法MPPT控制器simulink仿真

最大功率点跟踪(MPPT)控制器对于光伏(PV)系统至关重要,因为它可以确保系统在所有操作条件下都能从光伏阵列中提取最大功率。扰动观察法(P&O)是一种广泛使用的MPPT算法,因为它简单且易于实现。本文介绍了P&O MPPT控制器的Simulink仿真,并分析了其性能。

qq_59747472的博客 318

终极NES音乐制作神器FamiStudio:从零开始创作8位游戏音乐 [特殊字符][特殊字符]

FamiStudio是一款功能强大的NES音乐编辑器,专为怀旧游戏开发者和音乐爱好者设计,让你能够轻松创作出经典的8位游戏音乐。这款终极工具让任何人都能快速上手制作NES风格的音乐,无需复杂的编程知识,就能创作出令人惊艳的8位音效和配乐。 ## 🚀 为什么选择FamiStudio? FamiStudio是当前最完整的NES音乐制作解决方案,支持Windows、macOS、Linux和Andr

gitblog_01057的博客 813

人像美肤 人体美型 CVPR 2022 ABPN

人像美肤 CVPR 2022 ABPN

jacke121的专栏 841

构建 Cocos2dx 安卓游戏(二)

在本章中,我们通过使用 Cocos2d-x 框架捆绑的两个音频引擎,以非常简单的方式为我们的游戏添加了背景音乐和音效。在下一章中,我们将介绍如何将粒子系统添加到我们的游戏中,以模拟每次炸弹击中player精灵时的更真实的爆炸效果。到目前为止,我们已经尝试了 Cocos2d-x 框架中捆绑的所有粒子系统,但在我们作为游戏开发者的旅程中,将有很多情况需要我们创建自己的粒子系统。有一些工具允许我们以非常图形化的方式创建和调整粒子系统的属性。这使我们能够创建**所见即所得(WYSIWYG)**类型的粒子系统。

龙哥盟 791

Codex 100个真实案例 - 用AI批量清洗Excel脏数据(10万行3分钟搞定)

每个做数据分析的人都被"脏数据"折磨过——空值、重复行、日期格式五花八门、手机号多一位少一位……手动清洗几千行就已经让人崩溃,更别提10万行了。本文将展示如何用 Codex 生成一套完整的 Python pandas 数据清洗工具,从读取Excel/CSV、识别脏数据、自动清洗、生成清洗报告,到可视化对比清洗前后的数据质量,全程自然语言驱动,10万行数据3分钟搞定!

yueyeguzhuo的专栏 88

在 SAP S/4HANA Private Cloud 中把标准 CDS View 发布为 OData:可操作的四条路径与完整示例

在 ADT 中创建。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 726

Godot引擎实时音频合成:从原理到动态游戏音效实战

音频合成是计算机生成声音的核心技术,它通过算法实时生成波形,而非播放预录制文件。其原理基于数字信号处理,通过控制振荡器的频率、振幅与波形来模拟各种音色。这项技术的价值在于提供了极高的灵活性与交互性,能够根据程序逻辑动态调整声音的每一个参数。在游戏开发、交互媒体和实时音频处理等应用场景中,合成器是实现动态音乐、自适应音效和环境声效的关键工具。本文以Godot引擎为例,深入剖析其内置的`AudioStreamGenerator`音频流水线,并详解如何构建支持复音与ADSR包络的合成器系统,最终将其应用于创建动态

weixin_33922672的博客 448

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

英雄无敌3重制版VCMI安卓安装全攻略:从零开始畅玩经典策略游戏

还在怀念《英雄无敌3》的经典战棋策略吗?想在手机上随时随地体验这款不朽神作?VCMI开源引擎让这一切成为可能!🎮 本指南将带你**快速、安全、免费**地在安卓设备上安装和配置VCMI,重温《魔法门之英雄无敌3》的无限魅力。 ## 📋 文章概览 本文专为安卓用户打造,涵盖**VCMI安卓版安装**的完整流程。无论你是初次接触的新手,还是遇到安装问题的老玩家,都能在这里找到解决方案。我们将从*

gitblog_00787的博客 327

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

构建 Cocos2dx 安卓游戏(一)

Cocos2d-x 是最常使用的开源游戏框架。它得到了微软对其移动和桌面平台官方支持,其小巧的核心运行速度比其他框架快,使得它能在低端 Android 设备上表现出色。目前,它由一个活跃的开源开发社区维护,该社区由原始 Cocos2d for iPhone 的作者和触控科技领导。这本入门书籍将指导你从零开始创建一个简单的二维 Android 游戏。在这个过程中,你将学习 Cocos2d-x C++跨平台游戏框架的基础知识,如何处理精灵,为游戏添加物理效果,播放声音,显示文本,使用粒子系统生成逼真的爆炸效果,

龙哥盟 906

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Folia 酷狗音源实战:配置与扫码登录三步接口完整解析

Folia 桌面版装完就能听酷狗,Web 版则要先指到一个自建的 KuGouMusicApi。本文按序讲清 Folia(folia-major)这款主打歌词动画、同时支持 Navidrome 与多平台在线音源的本地播放器里,酷狗音源的接入配置、扫码登录流程与登录后能力。 [![Folia 酷狗音源搜索界面](https://raw.gitcode.com/GitHub_Trending/fo/f

gitblog_00569的博客 401

个人开发独立游戏《是男人就上一百层》源码

上大学时,本人电脑里有一款小游戏,名字叫《是男人就上100层》,当时觉得这个游戏挺有意思,难度看似很高,但掌握了规律后能玩很久,还有点让人上瘾的感觉。进一步了解,才知道该游戏的原名叫《NS-Tower》,由日本Nagi-P公司开发。 后来接触了安卓开发,便想在安卓上实现这个游戏来练手。当时想这么简单的一个游戏,也没有必要用什么游戏引擎,就准备直接用安卓原生API来实现。...

a88868886的博客 857
上一篇: 从零开始Android游戏编程(第二版) 第十一章 演员(Actor)、视口(ViewWindow),演出开始
下一篇: 从零开始Android游戏编程(第二版)
yexing
博客等级 码龄25年 153粉丝 18原创
评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值