【Android】AudioTrack播放caf音频文件

时间:2022-05-10 14:39:14
我们知道iPhone录制的音频都是caf格式,Android的Mediaplayer不支持这个格式的播放..那么怎么办? 我们使用AudioTrack来播放!!代码如下:
import Android.app.Activity;  
import Android.os.Bundle;  
import Android.view.View;  
import Android.widget.Button;  
import Android.widget.TextView;  
import Android.media.MediaPlayer;  
import Android.media.AudioManager;  
import Android.media.AudioTrack;  
import Android.media.AudioFormat;  
  
public class LRChannel extends Activity {  
    private Button lButton;  
    private Button rButton;  
    private TextView myTextView;  
    private MediaPlayer mMediaPlayer01 = null;  
    private AudioTrack aAudioTrack01 = null;  
    private String strFilePath = "/sdcard/test.caf";  
    private float midVol = 0;  
     
      
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
          
        lButton = (Button) findViewById(R.id.ButtonL);  
        rButton = (Button) findViewById(R.id.ButtonR);  
        myTextView = (TextView) findViewById(R.id.myTextView);  
          
        // left button response   
        lButton.setOnClickListener(new Button.OnClickListener()  
        {  
          @Override  
          public void onClick(View arg0)  
          {  
                playSound(strFilePath, 0);  
  
          }  
        });  
          
        // right button response   
        rButton.setOnClickListener(new Button.OnClickListener()  
        {  
          @Override  
          public void onClick(View arg0)  
          {  
              playSound(strFilePath, 1);  
          }  
        });  
    }  
     
    // iChannel = 0 means left channel test, iChannel = 1 means right channel test.   
    private void playSound(String strPath, int iChannel)  
    {  
      // If now is playing...   
      if ( aAudioTrack01 != null )  
      {  
          aAudioTrack01.release();  
          aAudioTrack01 = null;  
      }  
      // Get the AudioTrack minimum buffer size   
      int iMinBufSize = AudioTrack.getMinBufferSize(44100,  
                          AudioFormat.CHANNEL_CONFIGURATION_STEREO,  
                          AudioFormat.ENCODING_PCM_16BIT);  
      if ( iMinBufSize == AudioTrack.ERROR_BAD_VALUE || iMinBufSize == AudioTrack.ERROR )  
      {  
          return;  
      }  
      // Constructor a AudioTrack object   
      try  
      {  
          aAudioTrack01 = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,  
                    AudioFormat.CHANNEL_CONFIGURATION_STEREO,  
                    AudioFormat.ENCODING_PCM_16BIT,  
                    iMinBufSize,  
                    AudioTrack.MODE_STREAM);  
      }  
      catch (IllegalArgumentException iae)  
      {  
          myTextView.setText("new AudioTrack Exceeption:" + iae.toString());  
          iae.printStackTrace();  
      }  
      // Write data to buffer   
      byte data[] = new byte[iMinBufSize];  
      aAudioTrack01.write(data, 0, data.length);  
      aAudioTrack01.write(data, 0, data.length);  
      float lValue = 0;  
      float rValue = 0;  
        
      if ( iChannel == 0 )  
      {  
          lValue = 1.0f;  
          rValue = 0.0f;  
      }  
      else if ( iChannel == 1 )  
      {  
          lValue = 0.0f;  
          rValue = 1.0f;  
      }  
        
      aAudioTrack01.play();  
      if ( aAudioTrack01.setStereoVolume(lValue, rValue) == AudioTrack.SUCCESS )  
      {  
          myTextView.setText("setStereoVolume successfully!");  
      }  
      aAudioTrack01.stop();  
      if ( aAudioTrack01.setStereoVolume(midVol, midVol) == AudioTrack.SUCCESS )  
      {  
          myTextView.setText("Restore setStereoVolume successfully!");  
      }  
      aAudioTrack01.release();  
      aAudioTrack01 = null;  
    }  
     
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        // TODO Auto-generated method stub   
        if ( aAudioTrack01 != null ) {  
            aAudioTrack01.setStereoVolume(midVol, midVol);  
            aAudioTrack01.release();  
            aAudioTrack01 = null;  
        }  
    }  
     
}