Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中的音頻處理------SoundPool,MediaRecorder,MediaPlayer以及RingStone總結

Android中的音頻處理------SoundPool,MediaRecorder,MediaPlayer以及RingStone總結

編輯:關於Android編程

用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();
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();
		    }
	}



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved