Android AudioTrack/AudioRecord <2>

AudioTrack可以读取网络上面的,这个需要后面去添加,涉及的东西太多了,

现在看看AudioRecord,查看API : http://developer.android.com/reference/android/media/AudioRecord.html

<1> : AudioRecord构造函数:

public  AudioRecord (int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes) 

第一个参数: audioSource : 音源,一般是设备的mic,当然也可以录取网络上面的,不过不管从何处得到音源,都是处理字节流,音源种类参见:http://developer.android.com/reference/android/media/MediaRecorder.AudioSource.html

第二个参数:sampleRateInHz : 采样率,现在普通的一般采用44100,当然还有16000,因设备而一定吧.

第三个参数:channelConfig :  CHANNEL_IN_MONO 等,相对AudioTrack,OUT改成了IN.

第四个参数:audioFormat : 16位或者8位;

第五个参数:bufferSizeInBytes : 一般的手机android,采用getMinBufferSize(int, int, int)获取,不过人工也可以根据特定操作环境设置.

<2> : 初始化:

private AudioRecord mRec;
    private int mSampleRateInHz = 44100;
    private int mRecBufferSize;
mRecBufferSize = AudioRecord.getMinBufferSize(mSampleRateInHz,
                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        mRec = new AudioRecord(MediaRecorder.AudioSource.MIC, mSampleRateInHz,
                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                mRecBufferSize);

        mRec.startRecording();

<3> : 同样在一个线程中进行录音:

package com.example.audiodemo02;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

    private AudioRecord mRec;
    private int mSampleRateInHz = 44100;
    private int mRecBufferSize;
    
    private Button mStart;
    private Button mStop;

    private boolean mRecbool=true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mStart=(Button)findViewById(R.id.button1);
        mStart.setOnClickListener(this);
        
        mRecBufferSize = AudioRecord.getMinBufferSize(mSampleRateInHz,
                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        mRec = new AudioRecord(MediaRecorder.AudioSource.MIC, mSampleRateInHz,
                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                mRecBufferSize);

        mRec.startRecording();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private class RecordThread implements Runnable {

        @Override
        public void run() {
            // TODO Auto-generated method stub

            FileOutputStream fos = null;
            
            File mFile=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/data/files/");
            mFile.mkdir();
            
            mRecbool=true;
            
            try {
                File.createTempFile("rec", ".pcm", mFile);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            try {
                fos=new FileOutputStream(mFile);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            short[] rec_buffer = new short[mRecBufferSize];
            int length;

            while (mRecbool) {
                
                mRec.read(rec_buffer, 0, rec_buffer.length);
                
                try {
                    fos.write(short2byte(rec_buffer), 0, mRecBufferSize);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
            
            try {
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

    // convert short to byte
    private byte[] short2byte(short[] sData) {
        int shortArrsize = sData.length;
        byte[] bytes = new byte[shortArrsize * 2];
        for (int i = 0; i < shortArrsize; i++) {
            bytes[i * 2] = (byte) (sData[i] & 0x00FF);
            bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
            sData[i] = 0;
        }
        return bytes;

    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        int id=arg0.getId();
        switch(id){
        case R.id.button1:
            Thread recThread=new Thread(new RecordThread(),"rec");
            recThread.start();
            break;
        case R.id.button2:
            mRecbool=false;
            break;
        }
    }

}


 

其余的可以类似AudioTrack操作方式和写法.

 

 

posted @ 2014-03-19 01:04  MMLoveMeMM  阅读(350)  评论(0编辑  收藏  举报