2013-07-05 41 views
0

嗨我已閱讀一些post具有相同的問題,但無法找到確切的或我必須說我一直在尋找的答案。那麼我只是想知道如何獲得mediaplayer上設置的音頻文件的播放級別。我已經嘗試了int volume_level = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);,但從我看到的。我只能獲取設備上的當前音量。那麼我想達到的是添加一個動畫,隨着我的音頻播放水平。這裏是我到目前爲止的代碼:通過獲取mediaPlayer的振幅來生成進度條

播放音頻方法的調用之前:

audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 

回放的方法:

public void playAudio(String record_path) throws IOException{ 
     if(audioPlayer!=null && mpStatus == State.Paused){ 
      /*play from paused state*/ 
      audioPlayer.start(); 
      mpStatus = State.Playing; 
     } 
     else 
     { 
      /*play from start of recording*/ 
      setMediaPlayer(record_path); 
      audioPlayer.start(); 
      mpStatus = State.Playing; 
     } 
    } 

和螺紋:

private class playBackRunnable extends Thread { 
     final long start_time = System.currentTimeMillis(); 

     public void run() { 
      while(chk_play.isChecked()){ 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        return; 
       } catch (Exception e) { 
        return; 
       } 

       final long elapsed = System.currentTimeMillis() - start_time; 
       final String elapsed_time = util.getAsTime((int) elapsed); 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         int volume_level = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 

         int amp = (int)(volume_level * 100.f)/100; 
         Log.v("Volume Level", String.valueOf(amp)); 

         if(chk_play.isChecked()){ 
          prog_volume.setProgress(amp); 
          //txt_rectime.setText(elapsed_time); 

          if(amp <= 40){ 
           prog_volume.setProgressDrawable(getResources().getDrawable(R.drawable.progress_green)); 
          }else if(amp <= 60){ 
           prog_volume.setProgressDrawable(getResources().getDrawable(R.drawable.progress_yellow)); 
          }else if(amp <= 80){ 
           prog_volume.setProgressDrawable(getResources().getDrawable(R.drawable.progress_orange)); 
          }else { 
           prog_volume.setProgressDrawable(getResources().getDrawable(R.drawable.progress_red)); 
          } 
         } 

        } 
       }); 
      } 
     } 
    } 

希望有人能幫助我。提前致謝。

編輯:

新增audioPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); audioPlayer.prepare()之前,仍無法正常工作。

+0

您是否得到任何解決方案? – user1517153

+0

不是。但我想我可能會在下次再嘗試這樣做。 :d – KaHeL

回答

1

我知道的唯一解決方案是使用Visualizer類。爲了方便起見,我建議使用KitKat live wallpaper sources中的AudioCapture.java,它通過Visualizer添加數據處理層。上面鏈接的項目也給出了一些使用示例,下面是我如何在JUnits測試中使用它:

private int getAudioOutputAmplitude(int durationInSeconds) throws InterruptedException { 
    AudioCapture mAudioCapture = new AudioCapture(AudioCapture.TYPE_PCM, 1024); 
    mAudioCapture.start(); 
    Thread.sleep(durationInSeconds * 1000); 
    int [] mVizData; 
    mVizData = mAudioCapture.getFormattedData(1, 1); 
    mAudioCapture.release(); 
    int minValue = 0; 
    int maxValue = 0; 
    for (int value:mVizData){ 
     if (value<minValue){ 
      minValue = value; 
     } else if (value>maxValue){ 
      maxValue = value; 
     } 
    } 
    return maxValue-minValue; 
}