Android中的音频处理------SoundPool,MediaRecorder,MediaPlayer以及RingStone总结
用Soundpool可以播一些短的反应速度要求高的声音, 比如游戏中的爆破声,
而Mediaplayer适合播放长点的。 MediaRecorder主要用来录音。
SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作。
但是这里如果音效文件过大没有载入完成,我们调用play方法时可能产生严重的后果,
这里AndroidSDK提供了一个SoundPool.OnLoadCompleteListener类来帮助我们了解媒体文件是否载入完成,
我们重载onLoadComplete(SoundPool soundPool, int sampleId, int status) 方法即可获得。
sampleId |
the sample ID of the sound loaded. |
status |
the status of the load operation (0 = success) |
从上面的onLoadComplete方法可以看出该类有很多参数,
比如类似id,SoundPool在load时可以处理多个媒体一次初始化并放入内存中,
这里效率比MediaPlayer高了很多。
SoundPool类支持同时播放多个音效,这对于游戏来说是十分必要的,
而MediaPlayer类是同步执行的只能一个文件一个文件的播放。
创建:
public SoundPool(int maxStream, intstreamType, int srcQuality)
maxStream —— 同时播放的流的最大数量
streamType —— 流的类型,一般为STREAM_MUSIC(具体在AudioManager类中列出)
srcQuality —— 采样率转化质量,当前无效果,使用0作为默认值
eg:
SoundPool soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC,0);
创建了一个最多支持3个流同时播放的,类型标记为音乐的SoundPool。
一般把多个声音放到HashMap中去,比如
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC,100);
soundPoolMap = new HashMap<Integer,Integer>();
soundPoolMap.put(1, soundPool.load(this, R.raw.dingdong,1));
加载:
int load(Context context, intresId, int priority) //从APK资源载入
int load(FileDescriptor fd, long offset, long length, intpriority) //从FileDescriptor对象载入
int load(AssetFileDescriptor afd, int priority) //从Asset对象载入
int load(String path, int priority) //从完整文件路径名载入
最后一个参数为优先级。
播放:
play(int soundID, float leftVolume, float rightVolume, int priority, int loop,float rate) ,
其中leftVolume和rightVolume表示左右音量,priority表示优先级,loop表示循环次数,rate表示速率,
如
//速率最低0.5最高为2,1代表正常速度
sp.play(soundId, 1, 1, 1, 0, 1.0f);
而停止则可以使用 pause(int streamID) 方法,
这里的streamID和soundID均在构造SoundPool类的第一个参数中指明了总数量,而id从0开始。
获取audioManager对象
AudioManager mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
播放音效
mAudioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
一般AudioManager在OnResume和OnStop方法需进行如下处理:
// Get ready to play sound effects
@Override
protected void onResume() {
super.onResume();
mAudioManager.setSpeakerphoneOn(true);
mAudioManager.loadSoundEffects();
} // Release resources & clean up
@Override
protected void onPause() {
if (null != mSoundPool) {
mSoundPool.unload(mSoundId);
mSoundPool.release();
mSoundPool = null;
}
mAudioManager.setSpeakerphoneOn(false);
mAudioManager.unloadSoundEffects();
super.onPause();
}
MediaRecorder用来录音。
开启录音:
private static final String mFileName = Environment
.getExternalStorageDirectory().getAbsolutePath()
+ "/audiorecordtest.3gp";
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(TAG, "Couldn't prepare and start MediaRecorder");
} mRecorder.start();
}
关闭录音:
private void stopRecording() {
if (null != mRecorder) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
}
方法说明:
MediaRecorder中的setAudioSource()方法设置声音来源,一般传入MediaRecorder.AudioSource.MIC指定录制来自麦克风的声音。
setOutputFormat设置录制音频文件的格式。(注意必须在设置编码格式之前设置,否则会抛出异常)
setAudioEncoder设置编码格式
setAudioEncodingBitRate(int bitRate)设置编码位率
setAudioSamplingRate(int samplingRate)设置采样率
setOutputFile(String path)设置音频文件的保存位置
然后prepare(),start() 开始播放
stop(),release() 停止播放,释放资源
MediaPlayer
Android支持有限數量的同步Media Player對象,如果不釋放它們,將會在系統耗盡資源時導致ANR
因此,完成播放時調用mediaPlay.release()方法釋放相關資源。
//從一個包資源加載音頻
MediaPlayerresourcePlayer = MediaPlayer.create(this, R.raw.my_audio);
//從一個本地文件加載音頻
MediaPlayer resourcePlayer= MediaPlayer.create(this, Uri.parse("file:///sdcard/localfile.mp3"));
//從一個在線資源加載音頻
MediaPlayer resourcePlayer= MediaPlayer.create(this, Uri.parse(URL));
//從一個Content Provider加載音頻
MediaPlayerresourcePlayer = MediaPlayer.create(this,
Settings.System.DEFAULT_RINGTONE_URI);
//還可以setDataSource方法
MediaPlayermediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource("/sdcard/123.mp3");
mediaPlayer.prepare();
常用方法
mediaPlayer.start()
mediaPlayer.stop()
mediaPlayer.pause()
//調節左右聲道音量 0~1之間的浮點數 0是靜音 1是最大
mediaPlayer.setVolume(0.5f,0.5f)
//強制屏幕常亮
mediaPlayer.setScreenOnWhilePlaying(true)
//循環播放
If(!mediaPlayer.isLooping()){
mediaPlayer.setLooping(true);
}
示例代码:
播放音樂并震動:
mediaPlayer = new MediaPlayer();
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
long[] pattern = { 1000, 200, 200, 200 };
vibrator.vibrate(pattern, 0);
try {
mediaPlayer.setVolume(1.0f, 1.0f);
mediaPlayer.setDataSource(this,
Uri);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
mediaPlayer.setLooping(true);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (Exception e) {
mediaPlayer.release();
}
播放铃声RingStone:
种类包括:
RingtoneManager.TYPE_RINGTONE
RingtoneManager.TYPE_NOTIFICATION
RingtoneManager.TYPE_ALARM
示例:
Uri ringtoneUri = RingtoneManager
.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
playRingtone(RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri)); // Shut off current Ringtone and play new one
private void playRingtone(Ringtone newRingtone) {
if (null != mCurrentRingtone && mCurrentRingtone.isPlaying())
mCurrentRingtone.stop();
mCurrentRingtone = newRingtone;
if (null != newRingtone) {
mCurrentRingtone.play();
}
}
Android中的音频处理------SoundPool,MediaRecorder,MediaPlayer以及RingStone总结的更多相关文章
- Android中的音频播放(MediaPlayer和SoundPool)
Android中音频和视频的播放我们最先想到的就是MediaPlayer类了,该类提供了播放.暂停.停止.和重复播放等方法.该类位于android.media包下,详见API文档.其实除了这个类还有一 ...
- Android音频开发之MediaRecorder/MediaPlayer
前言: 上次我们介绍了实时采集音频数据以及播放,今天我们来认识一下直接录制文件的方式. 直接上代码:录制管理类 public class MediaRecorderManager { public s ...
- Android中那些有你不知道的事
在安卓开发中,总有那么一些看似简单,实则绊脚的难题,等你去探索,等你去解决,也许你已经遇见了解决了,也许你还没碰上,写下这篇总结,希望能帮助那行即将遇到的朋友,快速解决这些小问题! 一.activit ...
- 【Android】播放音频的几种方式介绍
接下来笔者介绍一下Android中播放音频的几种方式,android.media包下面包含了Android开发中媒体类,当然笔者不会依次去介绍,下面介绍几个音频播放中常用的类: 1.使用MediaPl ...
- android中AudioRecord使用
一 什么是音频的采样率和采样大小 自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码.即PCM编码.PCM通过抽样.量化.编码三个步骤将连续变化的模拟信号转换为数字编码. 抽样:在 ...
- Android MediaPlayer播放一般音频与SoundPool播放短促的音效
[1]使用MediaPlayer实现一般的音频播放 MediaPlayer播放通常的音频文件 MediaPlayer mediaPlayer = new MediaPlayer(); if (medi ...
- android中常见声音操作方式(Ringtone,SoundPool,MediaPlayer)小结
在Android开发中有时候需要用到播放声音操作,在android API 的media包中有三种方式可供我们选择,它们分别是Ringtone,SoundPool,MediaPlayer.因为在我目前 ...
- Android中使用SoundPool来播放音频
今天找素材重做FlappyBird时学习了一下怎样为应用设置背景音频,发现通过封装SoundPool类就能够非常好的做到这一点. SoundPool类比較适合播放一些类似游戏音效这样的比較短促并且较小 ...
- Android Multimedia框架总结(三)MediaPlayer中创建到setDataSource过程
转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52392430 前言:前一篇的mediaPlayer ...
随机推荐
- Eclipse - 添加 PyDev 插件
1. 安装PyDev插件 启用Eclipse.在Help菜单中,选择Install New Software···, 然后点击Add按钮.在Location中输入:http://pydev.org/u ...
- JDK和JVM
JDK: JDK包含的基本组件包括: javac – 编译器,将源程序转成字节码 jar – 打包工具,将相关的类文件打包成一个文件 javadoc – 文档生成器,从源码注释中提取文档 jdb – ...
- everything is nothing
可以选ios,可以选择android ,可以选择javaee,因为不想让自己这段时间的努力没有一个完美的结局.最起码真的能做点东西出来,所以6.10--8.10,两个月把javaee实训的该准备.可以 ...
- c# HttpWebRequest与HttpWebResponse 绝技(转载)
c# HttpWebRequest与HttpWebResponse 绝技 如果你想做一些,抓取,或者是自动获取的功能,那么就跟我一起来学习一下Http请求吧.本文章会对Http请求时的Get和P ...
- C# Struct的内存布局
转载:http://www.csharpwin.com/csharpspace/10454r4891.shtml 问题:请说出以下struct的实例大小以及内存布局 struct Struct1 { ...
- 用Filezilla往ubuntu虚拟机上传文件
也许不用这么复杂,但就这么干了 1.安卓ubuntu虚拟机 2.虚拟机安装ssh服务:sudo apt-get openssh-server 3.虚拟机新建目录test 4.修改test文件夹的访问权 ...
- 搭建linux环境下jenkins可移植环境
1:背景 项目领域:android. 项目需求为:建立一个网站用于产品经理(以下称为PM)配置该apk所需服务插件,打包出包(包含:apk,文档,demo等等)给厂商并且记录打包出包等信息. 项目设计 ...
- Object-c 创建对象
创建对象有两种方法: 1. NSString *str = [NSString string]; 2. NSString *myStr = [[NSString alloc]init]; 第一种创建方 ...
- POJ 1185 状态压缩DP(转)
1. 为何状态压缩: 棋盘规模为n*m,且m≤10,如果用一个int表示一行上棋子的状态,足以表示m≤10所要求的范围.故想到用int s[num].至于开多大的数组,可以自己用DFS搜索试试看:也可 ...
- 问题:Maven: missing net.sf.json-lib
问题:Maven: missing net.sf.json-lib 解决: pom.xml里加入json-lib依赖,注意要添加classifier一行,如下: 这里maven地址:http://re ...