Android 通过AudioTrack播放CAF音频


我们知道iPhone录制的音频都是caf格式,Android的Mediaplayer不支持这个格式的播放..那么怎么办? 我们使用AudioTrack来播放!!代码如下:

  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.View;  
  4. import android.widget.Button;  
  5. import android.widget.TextView;  
  6. import android.media.MediaPlayer;  
  7. import android.media.AudioManager;  
  8. import android.media.AudioTrack;  
  9. import android.media.AudioFormat;  
  10.   
  11. public class LRChannel extends Activity {  
  12.     private Button lButton;  
  13.     private Button rButton;  
  14.     private TextView myTextView;  
  15.     private MediaPlayer mMediaPlayer01 = null;  
  16.     private AudioTrack aAudioTrack01 = null;  
  17.     private String strFilePath = "/sdcard/test.caf";  
  18.     private float midVol = 0;  
  19.      
  20.     /** Called when the activity is first created. */  
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);  
  25.           
  26.         lButton = (Button) findViewById(R.id.ButtonL);  
  27.         rButton = (Button) findViewById(R.id.ButtonR);  
  28.         myTextView = (TextView) findViewById(R.id.myTextView);  
  29.           
  30.         // left button response   
  31.         lButton.setOnClickListener(new Button.OnClickListener()  
  32.         {  
  33.           @Override  
  34.           public void onClick(View arg0)  
  35.           {  
  36.                 playSound(strFilePath, 0);  
  37.   
  38.           }  
  39.         });  
  40.           
  41.         // right button response   
  42.         rButton.setOnClickListener(new Button.OnClickListener()  
  43.         {  
  44.           @Override  
  45.           public void onClick(View arg0)  
  46.           {  
  47.               playSound(strFilePath, 1);  
  48.           }  
  49.         });  
  50.     }  
  51.      
  52.     // iChannel = 0 means left channel test, iChannel = 1 means right channel test.   
  53.     private void playSound(String strPath, int iChannel)  
  54.     {  
  55.       // If now is playing...   
  56.       if ( aAudioTrack01 != null )  
  57.       {  
  58.           aAudioTrack01.release();  
  59.           aAudioTrack01 = null;  
  60.       }  
  61.       // Get the AudioTrack minimum buffer size   
  62.       int iMinBufSize = AudioTrack.getMinBufferSize(44100,  
  63.                           AudioFormat.CHANNEL_CONFIGURATION_STEREO,  
  64.                           AudioFormat.ENCODING_PCM_16BIT);  
  65.       if ( iMinBufSize == AudioTrack.ERROR_BAD_VALUE || iMinBufSize == AudioTrack.ERROR )  
  66.       {  
  67.           return;  
  68.       }  
  69.       // Constructor a AudioTrack object   
  70.       try  
  71.       {  
  72.           aAudioTrack01 = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,  
  73.                     AudioFormat.CHANNEL_CONFIGURATION_STEREO,  
  74.                     AudioFormat.ENCODING_PCM_16BIT,  
  75.                     iMinBufSize,  
  76.                     AudioTrack.MODE_STREAM);  
  77.       }  
  78.       catch (IllegalArgumentException iae)  
  79.       {  
  80.           myTextView.setText("new AudioTrack Exceeption:" + iae.toString());  
  81.           iae.printStackTrace();  
  82.       }  
  83.       // Write data to buffer   
  84.       byte data[] = new byte[iMinBufSize];  
  85.       aAudioTrack01.write(data, 0, data.length);  
  86.       aAudioTrack01.write(data, 0, data.length);  
  87.       float lValue = 0;  
  88.       float rValue = 0;  
  89.         
  90.       if ( iChannel == 0 )  
  91.       {  
  92.           lValue = 1.0f;  
  93.           rValue = 0.0f;  
  94.       }  
  95.       else if ( iChannel == 1 )  
  96.       {  
  97.           lValue = 0.0f;  
  98.           rValue = 1.0f;  
  99.       }  
  100.         
  101.       aAudioTrack01.play();  
  102.       if ( aAudioTrack01.setStereoVolume(lValue, rValue) == AudioTrack.SUCCESS )  
  103.       {  
  104.           myTextView.setText("setStereoVolume successfully!");  
  105.       }  
  106.       aAudioTrack01.stop();  
  107.       if ( aAudioTrack01.setStereoVolume(midVol, midVol) == AudioTrack.SUCCESS )  
  108.       {  
  109.           myTextView.setText("Restore setStereoVolume successfully!");  
  110.       }  
  111.       aAudioTrack01.release();  
  112.       aAudioTrack01 = null;  
  113.     }  
  114.      
  115.     @Override  
  116.     protected void onDestroy() {  
  117.         super.onDestroy();  
  118.         // TODO Auto-generated method stub   
  119.         if ( aAudioTrack01 != null ) {  
  120.             aAudioTrack01.setStereoVolume(midVol, midVol);  
  121.             aAudioTrack01.release();  
  122.             aAudioTrack01 = null;  
  123.         }  
  124.     }  
  125.      
  126. }  

更多Android相关信息见Android 专题页面 http://www.bkjia.com/topicnews.aspx?tid=11

相关内容