Android SDK 提供的3套音频播放的API之玩转SoundPool,面试流程4轮技术面+1轮HR

1、SoundPool的使用

1.1、准备音频资源

将准备的音频文放入assets文件夹下或者res下的raw文件夹下:

  • assets下可以再新建文件夹批量加载,而raw只能同级存放单个加载;

  • 在assets内部单个文件超过1m时可能存在bug,在raw资源目录下不会存在;

  • SoundPool的音频文件大小不能超过1M同时时间超过5-6秒可能会出错。

1.2、SoundPool的构造方法

SoundPool(int maxStreams, int streamType, int srcQuality)

  • 参数maxStreams指定支持多少个声音,SoundPool对象中允许同时存在的最多的流的数量,该值太大就会报错AudioFlinger could not create track, status: -12 ,就听不到声音,可根据需求设定

  • 参数streamType指定声音类型,可以在AudioManager中定义流类型为STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING,STREAM_MUSIC 和STREAM_ALARM四种类型。

  • 参数srcQuality指定声音品质(采样率变换质量),一般直接设置为0!

运用方式:

private static final int MAX_SOUNDS = 1;

private SoundPool soundPool;

//第一个参数是可以支持的声音数量,第二个是声音类型,第三个是声音品质

soundPool = new SoundPool(MAX_SOUNDS, AudioManager.STREAM_MUSIC, 0);

但是上面的构造方法在api 21 被废弃了。API 21 以后使用SoundPool.Builder创建SoundPool对象实例:

private static final int MAX_SOUNDS = 1;

private SoundPool soundPool;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

soundPool = new SoundPool.Builder().setMaxStreams(MAX_SOUNDS).build();

} else {

//第一个参数是可以支持的声音数量,第二个是声音类型,第三个是声音品质

soundPool = new SoundPool(MAX_SOUNDS, AudioManager.STREAM_MUSIC, 0);

}

1.3、加载音频资源

int load(Context context, int resId, int priority)

Load the sound from the specified APK resource.

从APK资源载入,resId:如音频文件 R.raw.xxx

int soundID = soundPool.load(appContext, R.raw.tip, 1);

int load(String path, int priority)

Load the sound from the specified path. 从音频文件路径加载

int load(AssetFileDescriptor afd, int priority)

Load the sound from an asset file descriptor.

从asset 文件中加载

AssetFileDescriptor fileDescriptor = assetManager.openFd(“sounds/tip.mp3”);

int soundId = soundPool.load(fileDescriptor, 1);

int load(FileDescriptor fd, long offset, long length, int priority)

Load the sound from a FileDescriptor.

如存放在sd卡中的音频 FileDescriptor从文件中加载

1.4、播放音频资源

play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

用法方式:

int streamId = soundPool.play(

soundID, //声音id

1, //左声道:0.0f ~ 1.0f

1, //右声道:0.0f ~ 1.0f

1, //播放优先级:0表示最低优先级

repeatTime, //循环模式:0表示循环一次,-1表示一直循环,其他表示数字+1表示当前数字对应的循环次

1);//播放速度:1是正常,范围从0~2

关于播放控制的几个重要方法

// 通过流id暂停指定音频播放

final void pause(int streamID)

//恢复指定音频播放

final void resume(int streamID)

//停止指定音频播放

final void stop(int streamID)

//卸载指定音频

final boolean unload(int soundID)

//暂停所有音频的播放

final void autoPause()

//恢复所有暂停的音频播放

final void autoResum()

//设置指定id的音频循环播放次数

final void setLoop(int streamID, int loop)

//设置加载监听(因为加载是异步的,需要监听加载,完成后再播放)

void setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener listener)

//设置优先级(同时播放个数超过最大值时,优先级低的先被移除)

final void setPriority(int streamID, int priority)

//设置指定音频的播放速率,0.5~2.0(rate>1:加快播放,反之慢速播放)

final void setRate(int streamID, float rate)

//释放所有资源

final void release()

2、SoundPool的封装

SoundPool的封装
  • 为了使我们的代码更加清晰,我们将创建一个类,用于在Activity/Fragment之外加载和播放我们的声音。

  • 首先,我们创建一个名为SoundPlayer的类。我们需要一些方法来隐藏从外部类访问和加载声音文件的逻辑。

这是SoundPlayer的实现。您可以根据需要更改/添加一些代码,但这是基本要点。

完整代码如下:

import android.content.Context;

import android.media.AudioManager;

import android.media.SoundPool;

import android.os.Build;

import android.util.Log;

import java.util.HashMap;

/**

  • 本地提示音播放器

  • SoundPool用于播放声音短,文件小的音频,延时短

  • @author: heiyulong

面试复习笔记:

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
给文章留个小赞,就可以免费领取啦~

戳我领取:GitHub

《960页Android开发笔记》

Android SDK 提供的3套音频播放的API之玩转SoundPool,面试流程4轮技术面+1轮HR_第1张图片

《1307页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

Android SDK 提供的3套音频播放的API之玩转SoundPool,面试流程4轮技术面+1轮HR_第2张图片

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

《960页Android开发笔记》**

[外链图片转存中…(img-QIfvFl3n-1646549504685)]

《1307页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

[外链图片转存中…(img-TonVMcmt-1646549504687)]

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

你可能感兴趣的:(程序员,架构,面试,android)