用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方法需进行如下处理:

  1. // Get ready to play sound effects
  2. @Override
  3. protected void onResume() {
  4. super.onResume();
  5. mAudioManager.setSpeakerphoneOn(true);
  6. mAudioManager.loadSoundEffects();
  7. }
  8.  
  9. // Release resources & clean up
  10. @Override
  11. protected void onPause() {
  12. if (null != mSoundPool) {
  13. mSoundPool.unload(mSoundId);
  14. mSoundPool.release();
  15. mSoundPool = null;
  16. }
  17. mAudioManager.setSpeakerphoneOn(false);
  18. mAudioManager.unloadSoundEffects();
  19. super.onPause();
  20. }

MediaRecorder用来录音。

开启录音:

  1. private static final String mFileName = Environment
  2. .getExternalStorageDirectory().getAbsolutePath()
  3. + "/audiorecordtest.3gp";
  4. private void startRecording() {
  5. mRecorder = new MediaRecorder();
  6. mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  7. mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  8. mRecorder.setOutputFile(mFileName);
  9. mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  10.  
  11. try {
  12. mRecorder.prepare();
  13. } catch (IOException e) {
  14. Log.e(TAG, "Couldn't prepare and start MediaRecorder");
  15. }
  16.  
  17. mRecorder.start();
  18. }

关闭录音:

  1. private void stopRecording() {
  2. if (null != mRecorder) {
  3. mRecorder.stop();
  4. mRecorder.release();
  5. mRecorder = null;
  6. }
  7. }

方法说明:

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);

}

示例代码:

  1. 播放音樂并震動:
  2. mediaPlayer = new MediaPlayer();
  3. vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
  4. long[] pattern = { 1000, 200, 200, 200 };
  5. vibrator.vibrate(pattern, 0);
  6. try {
  7. mediaPlayer.setVolume(1.0f, 1.0f);
  8. mediaPlayer.setDataSource(this,
  9. Uri);
  10. mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
  11. mediaPlayer.setLooping(true);
  12. mediaPlayer.prepare();
  13. mediaPlayer.start();
  14. } catch (Exception e) {
  15. mediaPlayer.release();
  16. }

播放铃声RingStone:

种类包括:

RingtoneManager.TYPE_RINGTONE

RingtoneManager.TYPE_NOTIFICATION

RingtoneManager.TYPE_ALARM

示例:

  1. Uri ringtoneUri = RingtoneManager
  2. .getDefaultUri(RingtoneManager.TYPE_RINGTONE);
  3. playRingtone(RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri));
  4.  
  5. // Shut off current Ringtone and play new one
  6. private void playRingtone(Ringtone newRingtone) {
  7. if (null != mCurrentRingtone && mCurrentRingtone.isPlaying())
  8. mCurrentRingtone.stop();
  9. mCurrentRingtone = newRingtone;
  10. if (null != newRingtone) {
  11. mCurrentRingtone.play();
  12. }
  13. }

Android中的音频处理------SoundPool,MediaRecorder,MediaPlayer以及RingStone总结的更多相关文章

  1. Android中的音频播放(MediaPlayer和SoundPool)

    Android中音频和视频的播放我们最先想到的就是MediaPlayer类了,该类提供了播放.暂停.停止.和重复播放等方法.该类位于android.media包下,详见API文档.其实除了这个类还有一 ...

  2. Android音频开发之MediaRecorder/MediaPlayer

    前言: 上次我们介绍了实时采集音频数据以及播放,今天我们来认识一下直接录制文件的方式. 直接上代码:录制管理类 public class MediaRecorderManager { public s ...

  3. Android中那些有你不知道的事

    在安卓开发中,总有那么一些看似简单,实则绊脚的难题,等你去探索,等你去解决,也许你已经遇见了解决了,也许你还没碰上,写下这篇总结,希望能帮助那行即将遇到的朋友,快速解决这些小问题! 一.activit ...

  4. 【Android】播放音频的几种方式介绍

    接下来笔者介绍一下Android中播放音频的几种方式,android.media包下面包含了Android开发中媒体类,当然笔者不会依次去介绍,下面介绍几个音频播放中常用的类: 1.使用MediaPl ...

  5. android中AudioRecord使用

    一 什么是音频的采样率和采样大小 自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码.即PCM编码.PCM通过抽样.量化.编码三个步骤将连续变化的模拟信号转换为数字编码. 抽样:在 ...

  6. Android MediaPlayer播放一般音频与SoundPool播放短促的音效

    [1]使用MediaPlayer实现一般的音频播放 MediaPlayer播放通常的音频文件 MediaPlayer mediaPlayer = new MediaPlayer(); if (medi ...

  7. android中常见声音操作方式(Ringtone,SoundPool,MediaPlayer)小结

    在Android开发中有时候需要用到播放声音操作,在android API 的media包中有三种方式可供我们选择,它们分别是Ringtone,SoundPool,MediaPlayer.因为在我目前 ...

  8. Android中使用SoundPool来播放音频

    今天找素材重做FlappyBird时学习了一下怎样为应用设置背景音频,发现通过封装SoundPool类就能够非常好的做到这一点. SoundPool类比較适合播放一些类似游戏音效这样的比較短促并且较小 ...

  9. Android Multimedia框架总结(三)MediaPlayer中创建到setDataSource过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52392430 前言:前一篇的mediaPlayer ...

随机推荐

  1. ubuntu文件管理常用命令 分类: linux ubuntu 学习笔记 2015-07-02 16:57 29人阅读 评论(0) 收藏

    1.关闭防火墙:ufw disable 2.以.开头的表示隐藏文件 3..和..分别代表当前目录以及当前目录的父目录 4.显示当前用户所在目录pwd 5.touch创建空文件 6.mkdir创建新目录 ...

  2. POSIX字符类型

    [:alnum:] 字母与数字 [:alpha:] 字母 [:blank:] 空格与制表符 [:cntrl:] 控制字符 [:digit:] 数字 [:graph:] 可打印的与可见的(不包括空格)字 ...

  3. springmvc使用aop心得

    第一步:创建aop拦截类: @Component @Aspect public class ControllerSelectorInterceptor { @Before("executio ...

  4. C# 引用SHDocVw 实现模拟网页操作

    因为最近项目需要,所以接触到了网页爬取. 1. HttpWebRequest 初期接触的都是一些比较简单的网页,通过Fiddler抓包分析后,就能模拟进行http请求,进行想要的操作. 2. WebB ...

  5. HTML+CSS基础学习笔记(2)

    一.无序列表标签ul <ul> <li>信息</li> <li>信息</li> ...... </ul> 代码解释:每项< ...

  6. git 分布式版本控制了解

    今天也来了解一下这个版本控制神器,下面了解一些词语的意思 先说集中式版本系统,版本库是集中放在中央服务器的,干活的时候,都是用自己的电脑,从中央处理器取得最新的版本,干完活后,在把自己的活推送给服务器 ...

  7. JS关闭窗口或JS关闭页面的几种代码

    //JS定时自动关闭窗口 <script language="javascript"> <!-- function closewin(){ self.opener ...

  8. QueryString传值的加密与解密方法 .

    //加密 Response.Redirect("DetailInfo.aspx?id=" + Convert.ToBase64String(System.Text.Encoding ...

  9. Android更新UI的两种方法——handler与runOnUiThread()

    在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面 显示常会报错.抛出异常:android.view.ViewRoo ...

  10. ios专题 -线程互斥与同步

    [原创]http://www.cnblogs.com/luoguoqiang1985 今天遇见了这问题,决定要需要讨论下. 线程同步的方法: @synchronized 官方文档解释:The @syn ...