標籤:des android style color io os 使用 ar java
用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@Overrideprotected void onResume() {super.onResume();mAudioManager.setSpeakerphoneOn(true);mAudioManager.loadSoundEffects();}// Release resources & clean up@Overrideprotected 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 oneprivate void playRingtone(Ringtone newRingtone) { if (null != mCurrentRingtone && mCurrentRingtone.isPlaying()) mCurrentRingtone.stop();mCurrentRingtone = newRingtone; if (null != newRingtone) { mCurrentRingtone.play(); }}
Android中的音頻處理------SoundPool,MediaRecorder,MediaPlayer以及RingStone總結