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总结

时间: 2024-10-23 14:06:39

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

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

Android中音频和视频的播放我们最先想到的就是MediaPlayer类了,该类提供了播放.暂停.停止.和重复播放等方法.该类位于android.media包下,详见API文档.其实除了这个类还有一个音乐播放类那就是SoundPool,这两个类各有不同分析一下便于大家理解 MediaPlayer: 此类适合播放较大文件,此类文件应该存储在SD卡上,而不是在资源文件里,还有此类每次只能播放一个音频文件. 此类用法如下: 1.从资源文件中播放 MediaPlayer   player  =   n

Android中那些有你不知道的事

在安卓开发中,总有那么一些看似简单,实则绊脚的难题,等你去探索,等你去解决,也许你已经遇见了解决了,也许你还没碰上,写下这篇总结,希望能帮助那行即将遇到的朋友,快速解决这些小问题! 一.activity中的PopupWindow. 之前在使用popupwindow的时候并未注意到这个问题,知道有一次偶然发现讲fragment中的弹窗移植到activity中时总是会报 寄存的view视图为null,如下图: 后来经过百度大神的指点,终于找到一个觉得讲得有理的原因,那就是popupwindow弹窗的

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

接下来笔者介绍一下Android中播放音频的几种方式,android.media包下面包含了Android开发中媒体类,当然笔者不会依次去介绍,下面介绍几个音频播放中常用的类: 1.使用MediaPlayer播放音频 MediaPlayer的功能很强大,下面附上一张该类封装音频的生命周期图: MediaPlayer支持AAC.AMR.FLAC.MP3.MIDI.OGG.PCM等格式,MediaPlayer可以通过设置元数据和播放源来音频. 1.1播放Raw文件夹下面音频的元数据 //直接创建,不

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

在Android开发中有时候需要用到播放声音操作,在android API 的media包中有三种方式可供我们选择,它们分别是Ringtone,SoundPool,MediaPlayer.因为在我目前的项目中暂时用不到播放很长的音频文件,只需要播放一些简短的提示音,所以在这篇博文中我只是简单的记录下. 1.Ringtone.java 2.SoundPool.java 3.MediaPlayer.java 4.demo 5.bug record 注意: 关于这三个类的介绍我全部用的是android

Android中使用SoundPool来播放音频

今天找素材重做FlappyBird时学习了一下怎样为应用设置背景音频,发现通过封装SoundPool类就能够非常好的做到这一点. SoundPool类比較适合播放一些类似游戏音效这样的比較短促并且较小的音频流,并且它支持同一时候播放多个音频流,而比較大的音频更适合用MediaPlayer来播放. 大致解说一下SoundPool类使用时的基本使用方法: 1. 把要用到的音频资源通过load()方法载入. 2. 通过创建的SoundPool对象的setOnLoadCompleteListener()

Android平台中关于音频播放

Android平台中关于音频播放有以下三种方式: 1.SoundPool ---- 适合短促且对反应速度比较高的情况(游戏音效或按键声等) 2.MediaPlayer ---- 适合比较长且时间要求不高的情况 3.AudioTrack ---- 播放解码后的PCM码流 方法一:SoundPool 1)SoundPool简介 SoundPool类是Android用于管理和播放应用程序的音频资源的类.一个SoundPool对象可以看作是一个可以从APK中导入资源或者从文件系统中载入文件的样本集合.它

Android中SoundPool的使用

大家知道MediaPlayer占用的资源比较多,且不可以同时支持播放多个音频,所以我们有一种叫做SoundPool,比如我们常见的按键音或者是手机提示音,还比如我们在游戏的开发中会有大量的音效效果等,下边介绍一下她的用法: 步骤如下: 1.创建SoundPool对象 源码如下 /** *SoundPool源码中的构造方法方法体 * * @param maxStreams 最多可以容纳多少个音频 * @param streamType 指定的声音类型,通过AudioManager类提供的常量进行指

如何在Android中播放网络传输过来的AAC音频?

============问题描述============ 如何在Android中播放网络传输过来的AAC音频?每个包都有ADTS头的. ============解决方案1============ 如果是应用的话,直接设置MediaPlayer setDataSource设置为网络音频的uri,然后prepareAsync(), prepare完成后调用start不就可以了吗? framework层的话还是要用aacdecoder进行解码播放,要么用软件解码,要么用硬件解码.

Android中的soundpool小结

之前只知道android中可以用mediaplayer播放音乐,原来今天才发现 可以用soundpool,用soundpool可以播一些短的反应速度要求高的声音, 比如游戏中的爆破声,而mediaplayer适合播放长点的. 1. SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作.但是这里如果音效文件过大没有载入完成,我们调用play方法时可能产生严重的后果,这里Android SDK提供了一个SoundPool.OnLoadCompleteListener类来帮助我们了