Android 通过AudioTrack播放CAF音频

来源:互联网 发布:华为路由器 端口转发 编辑:程序博客网 时间:2024/06/08 07:08

我们知道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;       /** Called when the activity is first created. */    @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;        }    }   }

        /**         * Play the sound by AudioTrack.         *          * @param soundData         *            The sound which is to be played.         */        private void playSound(byte[] soundData) {            int index = 0;            int offset = 0;            // 8000 byte every second            final int minBufsize = AudioTrack.getMinBufferSize(8000,                    AudioFormat.CHANNEL_OUT_STEREO,// The channel                    AudioFormat.ENCODING_PCM_16BIT);            mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,                    8000,                    AudioFormat.CHANNEL_OUT_STEREO,                    AudioFormat.ENCODING_PCM_16BIT,                    minBufsize,                    AudioTrack.MODE_STREAM);            mAudioTrack.play();            while (true) {                try {                    offset = index * minBufsize;                    if (offset >= soundData.length) {                        break;                    }                    publishProgress(offset);                    mAudioTrack.write(soundData, offset, minBufsize);                } catch (Exception e) {                    break;                }                index++;            }            mAudioTrack.release();        }


参考:

http://www.cnblogs.com/innost/archive/2011/01/09/1931457.html

http://crazier9527.iteye.com/blog/467061


原创粉丝点击