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

來源:互聯網
上載者:User

標籤: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總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.