您现在的位置:首页 > 博客 > Android开发 > 应用开发 > 正文
Android中利用AudioRecord和AudioTrack采取和播放音频
http://www.drovik.com/      2012-9-26 12:18:26      来源:CSDN社区      点击:
在Android中录音可以用MediaRecord录音,操作比较简单。但是不够专业,就是不能对音频进行处理。如果要进行音频的实时的处理或者音频的一些封装就可以用AudioRecord来进行录音了。

其中构造器的几个参数就是标准的声音采集参数
以下是参数的含义解释
public AudioRecord (int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)

audioSource the recording source. See MediaRecorder.AudioSource for recording source definitions.
音频源:指的是从哪里采集音频。这里我们当然是从麦克风采集音频,所以此参数的值为MIC

sampleRateInHz the sample rate expressed in Hertz. Examples of rates are (but not limited to) 44100, 22050 and 11025.
采样率:音频的采样频率,每秒钟能够采样的次数,采样率越高,音质越高。给出的实例是44100、22050、11025但不限于这几个参数。例如要采集低质量的音频就可以使用4000、8000等低采样率。

channelConfig describes the configuration of the audio channels. SeeCHANNEL_IN_MONO and CHANNEL_IN_STEREO

声道设置:android支持双声道立体声和单声道。MONO单声道,STEREO立体声
audioFormat the format in which the audio data is represented. SeeENCODING_PCM_16BIT and ENCODING_PCM_8BIT

编码制式和采样大小:采集来的数据当然使用PCM编码(脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。) android支持的采样大小16bit 或者8bit。当然采样大小越大,那么信息量越多,音质也越高,现在主流的采样大小都是16bit,在低质量的语音传输的时候8bit 足够了。

bufferSizeInBytes the total size (in bytes) of the buffer where audio data is written to during the recording. New audio data can be read from this buffer in smaller chunks than this size. See getMinBufferSize(int, int, int) to determine the minimum required buffer size for the successful creation of an AudioRecord instance. Using values smaller than getMinBufferSize() will result in an initialization failure.

采集数据需要的缓冲区的大小,如果不知道最小需要的大小可以在getMinBufferSize()查看。
采集到的数据保存在一个byteBuffer中,可以使用流将其读出。亦可保存成为文件的形式。
这里将数据写入文件,但是并不能播放,因为AudioRecord获得的音频是原始的裸音频,如果需要播放就必须加入一些格式或者编码的头信息。但是这样的好处就是你可以对音频的 裸数据进行处理,比如你要做一个爱说话的TOM猫,在这里就进行音频的处理,然后重新封装 所以说这样得到的音频比较容易做一些音频的处理。


音频采集示例代码:

public class TestAudioRecord extends Activity {  
    // 音频获取源  
    private int audioSource = MediaRecorder.AudioSource.MIC;  
    // 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025  
    private static int sampleRateInHz = 44100;  
    // 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道  
    private static int channelConfig = AudioFormat.CHANNEL_IN_STEREO;  
    // 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。  
    private static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;  
    // 缓冲区字节大小  
    private int bufferSizeInBytes = 0;  
    private Button Start;  
    private Button Stop;  
    private AudioRecord audioRecord;  
    private boolean isRecord = false;// 设置正在录制的状态  
    //AudioName裸音频数据文件  
    private static final String AudioName = "/sdcard/love.raw";  
    //NewAudioName可播放的音频文件  
    private static final String NewAudioName = "/sdcard/new.wav";  
  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        getWindow().setFormat(PixelFormat.TRANSLUCENT);// 让界面横屏  
        requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉界面标题  
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
                WindowManager.LayoutParams.FLAG_FULLSCREEN);  
        // 重新设置界面大小  
        setContentView(R.layout.main);  
        init();  
    }  
  
    private void init() {  
        Start = (Button) this.findViewById(R.id.start);  
        Stop = (Button) this.findViewById(R.id.stop);  
        Start.setOnClickListener(new TestAudioListener());  
        Stop.setOnClickListener(new TestAudioListener());  
        creatAudioRecord();  
    }  
  
    private void creatAudioRecord() {  
        // 获得缓冲区字节大小  
        bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz,  
                channelConfig, audioFormat);  
        // 创建AudioRecord对象  
        audioRecord = new AudioRecord(audioSource, sampleRateInHz,  
                channelConfig, audioFormat, bufferSizeInBytes);  
    }  
  
    class TestAudioListener implements OnClickListener {  
  
        @Override  
        public void onClick(View v) {  
            if (v == Start) {  
                startRecord();  
            }  
            if (v == Stop) {  
                stopRecord();  
            }  
  
        }  
  
    }  
  
    private void startRecord() {  
        audioRecord.startRecording();  
        // 让录制状态为true  
        isRecord = true;  
        // 开启音频文件写入线程  
        new Thread(new AudioRecordThread()).start();  
    }  
  
    private void stopRecord() {  
        close();  
    }  
  
    private void close() {  
        if (audioRecord != null) {  
            System.out.println("stopRecord");  
            isRecord = false;//停止文件写入  
            audioRecord.stop();  
            audioRecord.release();//释放资源  
            audioRecord = null;  
        }  
    }  
  
    class AudioRecordThread implements Runnable {  
        @Override  
        public void run() {  
            writeDateTOFile();//往文件中写入裸数据  
            copyWaveFile(AudioName, NewAudioName);//给裸数据加上头文件  
        }  
    }  
  
    /** 
     * 这里将数据写入文件,但是并不能播放,因为AudioRecord获得的音频是原始的裸音频, 
     * 如果需要播放就必须加入一些格式或者编码的头信息。但是这样的好处就是你可以对音频的 裸数据进行处理,比如你要做一个爱说话的TOM 
     * 猫在这里就进行音频的处理,然后重新封装 所以说这样得到的音频比较容易做一些音频的处理。 
     */  
    private void writeDateTOFile() {  
        // new一个byte数组用来存一些字节数据,大小为缓冲区大小  
        byte[] audiodata = new byte[bufferSizeInBytes];  
        FileOutputStream fos = null;  
        int readsize = 0;  
        try {  
            File file = new File(AudioName);  
            if (file.exists()) {  
                file.delete();  
            }  
            fos = new FileOutputStream(file);// 建立一个可存取字节的文件  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        while (isRecord == true) {  
            readsize = audioRecord.read(audiodata, 0, bufferSizeInBytes);  
            if (AudioRecord.ERROR_INVALID_OPERATION != readsize) {  
                try {  
                    fos.write(audiodata);  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
        try {  
            fos.close();// 关闭写入流  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
  
    // 这里得到可播放的音频文件  
    private void copyWaveFile(String inFilename, String outFilename) {  
        FileInputStream in = null;  
        FileOutputStream out = null;  
        long totalAudioLen = 0;  
        long totalDataLen = totalAudioLen + 36;  
        long longSampleRate = sampleRateInHz;  
        int channels = 2;  
        long byteRate = 16 * sampleRateInHz * channels / 8;  
        byte[] data = new byte[bufferSizeInBytes];  
        try {  
            in = new FileInputStream(inFilename);  
            out = new FileOutputStream(outFilename);  
            totalAudioLen = in.getChannel().size();  
            totalDataLen = totalAudioLen + 36;  
            WriteWaveFileHeader(out, totalAudioLen, totalDataLen,  
                    longSampleRate, channels, byteRate);  
            while (in.read(data) != -1) {  
                out.write(data);  
            }  
            in.close();  
            out.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
  
    /** 
     * 这里提供一个头信息。插入这些信息就可以得到可以播放的文件。 
     * 为我为啥插入这44个字节,这个还真没深入研究,不过你随便打开一个wav 
     * 音频的文件,可以发现前面的头文件可以说基本一样哦。每种格式的文件都有 
     * 自己特有的头文件。 
     */  
    private void WriteWaveFileHeader(FileOutputStream out, long totalAudioLen,  
            long totalDataLen, long longSampleRate, int channels, long byteRate)  
            throws IOException {  
        byte[] header = new byte[44];  
        header[0] = 'R'; // RIFF/WAVE header  
        header[1] = 'I';  
        header[2] = 'F';  
        header[3] = 'F';  
        header[4] = (byte) (totalDataLen & 0xff);  
        header[5] = (byte) ((totalDataLen >> 8) & 0xff);  
        header[6] = (byte) ((totalDataLen >> 16) & 0xff);  
        header[7] = (byte) ((totalDataLen >> 24) & 0xff);  
        header[8] = 'W';  
        header[9] = 'A';  
        header[10] = 'V';  
        header[11] = 'E';  
        header[12] = 'f'; // 'fmt ' chunk  
        header[13] = 'm';  
        header[14] = 't';  
        header[15] = ' ';  
        header[16] = 16; // 4 bytes: size of 'fmt ' chunk  
        header[17] = 0;  
        header[18] = 0;  
        header[19] = 0;  
        header[20] = 1; // format = 1  
        header[21] = 0;  
        header[22] = (byte) channels;  
        header[23] = 0;  
        header[24] = (byte) (longSampleRate & 0xff);  
        header[25] = (byte) ((longSampleRate >> 8) & 0xff);  
        header[26] = (byte) ((longSampleRate >> 16) & 0xff);  
        header[27] = (byte) ((longSampleRate >> 24) & 0xff);  
        header[28] = (byte) (byteRate & 0xff);  
        header[29] = (byte) ((byteRate >> 8) & 0xff);  
        header[30] = (byte) ((byteRate >> 16) & 0xff);  
        header[31] = (byte) ((byteRate >> 24) & 0xff);  
        header[32] = (byte) (2 * 16 / 8); // block align  
        header[33] = 0;  
        header[34] = 16; // bits per sample  
        header[35] = 0;  
        header[36] = 'd';  
        header[37] = 'a';  
        header[38] = 't';  
        header[39] = 'a';  
        header[40] = (byte) (totalAudioLen & 0xff);  
        header[41] = (byte) ((totalAudioLen >> 8) & 0xff);  
        header[42] = (byte) ((totalAudioLen >> 16) & 0xff);  
        header[43] = (byte) ((totalAudioLen >> 24) & 0xff);  
        out.write(header, 0, 44);  
    }  
  
    @Override  
    protected void onDestroy() {  
        close();  
        super.onDestroy();  
    }  
}  
/****************************/
public class RecorderTrack extends Activity {
private String TAG = "session";
private RadioGroup mRadioGroup1,mRadioGroup2,mRadioGroup3;
private RadioButton mRadio1,mRadio2,mRadio3,mRadio4,mRadio5,mRadio6,mRadio7; 
        private static final int RECORDER_BPP = 16;
        //private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav";
        private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";
        private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
        private static int frequency = 44100;
        private static int channelConfiguration = AudioFormat.CHANNEL_IN_STEREO;
        private static int EncodingBitRate = AudioFormat.ENCODING_PCM_16BIT;
        
        private AudioRecord audioRecord = null;
        private AudioTrack audioTrack = null;
        private int recBufSize = 0;
        private int playBufSize = 0;
        private Thread recordingThread = null;
        private boolean isRecording = false;
        private boolean isTracking = false;
        private boolean m_keep_running;
        
        protected PCMAudioTrack m_player;
        SeekBar skbVolume;//调节音量
        
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        setButtonHandlers();
        enableButton1(false);
   
    }

        private void setButtonHandlers() {
                ((Button)findViewById(R.id.btnRecord)).setOnClickListener(btnClick);
                ((Button)findViewById(R.id.btnStop)).setOnClickListener(btnClick);
                ((Button)findViewById(R.id.btnTrack)).setOnClickListener(btnClick);
                ((Button)findViewById(R.id.btnStop2)).setOnClickListener(btnClick);
                //((Button)findViewById(R.id.btnExit)).setOnClickListener(btnClick);
                mRadioGroup1 = (RadioGroup) findViewById(R.id.myRadioGroup1); 
                mRadioGroup2 = (RadioGroup) findViewById(R.id.myRadioGroup2); 
                mRadioGroup3 = (RadioGroup) findViewById(R.id.myRadioGroup3); 
                mRadio1 = (RadioButton) findViewById(R.id.myRadio1Button1);
                mRadio2 = (RadioButton) findViewById(R.id.myRadio1Button2);
                mRadio3 = (RadioButton) findViewById(R.id.myRadio2Button1);
                mRadio4 = (RadioButton) findViewById(R.id.myRadio2Button2);
                mRadio5 = (RadioButton) findViewById(R.id.myRadio2Button3);
                mRadio6 = (RadioButton) findViewById(R.id.myRadio3Button1);
                mRadio7 = (RadioButton) findViewById(R.id.myRadio3Button2);
              
                
                mRadioGroup1.setOnCheckedChangeListener(mChangeRadio1);
                mRadioGroup2.setOnCheckedChangeListener(mChangeRadio2);
                mRadioGroup3.setOnCheckedChangeListener(mChangeRadio3);
        }
        
        private void enableButton(int id,boolean isEnable){
                ((Button)findViewById(id)).setEnabled(isEnable);
        }
        
        private void enableButton0(boolean isRecording) {
            enableButton(R.id.btnRecord,!isRecording);
            enableButton(R.id.btnTrack,!isRecording);
            enableButton(R.id.btnStop2,!isRecording);
            enableButton(R.id.btnStop,isRecording);
        }
        
        private void enableButton1(boolean isRecording) {
                enableButton(R.id.btnRecord,!isRecording);
                enableButton(R.id.btnTrack,isRecording);
                enableButton(R.id.btnStop2,isRecording);
                enableButton(R.id.btnStop,isRecording);
        }
        
        private void enableButton2(boolean isRecording) {
            enableButton(R.id.btnRecord,!isRecording);
            enableButton(R.id.btnTrack,!isRecording);
            enableButton(R.id.btnStop2,isRecording);
            enableButton(R.id.btnStop,isRecording);
        }
        
        private void enableButton3(boolean isTracking) {
            enableButton(R.id.btnRecord,!isTracking);
            enableButton(R.id.btnStop,!isTracking);
            enableButton(R.id.btnTrack,!isTracking);
            enableButton(R.id.btnStop2,isTracking);
        }
        
        private void enableButton4(boolean isTracking) {
            enableButton(R.id.btnRecord,!isTracking);
            enableButton(R.id.btnStop,isTracking);
            enableButton(R.id.btnTrack,!isTracking);
            enableButton(R.id.btnStop2,isTracking);
        }
              
        private String getFilename(){
                String filepath = Environment.getExternalStorageDirectory().getAbsolutePath();
                File file = new File(filepath,AUDIO_RECORDER_FOLDER);
                
                if(file.exists()){
                  file.delete();
                }
                                
                return (file.getAbsolutePath() + "/session.wav" );
        }
        
        private String getTempFilename(){
                String filepath = Environment.getExternalStorageDirectory().getPath();
                File file = new File(filepath,AUDIO_RECORDER_FOLDER);
                
                if(!file.exists()){
                        file.mkdirs();
                }
                
                File tempFile = new File(filepath,AUDIO_RECORDER_TEMP_FILE);
                
                if(tempFile.exists())
                        tempFile.delete();
                
                return (file.getAbsolutePath() + "/" + AUDIO_RECORDER_TEMP_FILE);
        }
        
        private void startRecording(){
                
         createAudioRecord();
        
         audioRecord.startRecording();
                
                isRecording = true;
                
                recordingThread = new Thread(new Runnable() {
                        
                        @Override
                        public void run() {
                                writeAudioDataToFile();
                        }
                },"AudioRecorder Thread");
                
                recordingThread.start();
        }
        
        private void writeAudioDataToFile(){
                byte data[] = new byte[recBufSize];
                String filename = getTempFilename();
                FileOutputStream os = null;
                
                try {
                        os = new FileOutputStream(filename);
                } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                
                int read = 0;
                
                if(null != os){
                        while(isRecording){
                                read = audioRecord.read(data, 0, recBufSize);
                                
                                if(AudioRecord.ERROR_INVALID_OPERATION != read){
                                        try {
                                                os.write(data);
                                        } catch (IOException e) {
                                                e.printStackTrace();
                                        }
                                }
                        }
                        
                        try {
                                os.close();
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                }
        }
        
        private void stopRecording(){
                if(null != audioRecord){
                        isRecording = false;
                        
                        audioRecord.stop();
                        audioRecord.release();
                        
                        audioRecord = null;
                        recordingThread = null;
                }
                
                copyWaveFile(getTempFilename(),getFilename());
                deleteTempFile();
        }

        private void deleteTempFile() {
                File file = new File(getTempFilename());
                
                file.delete();
        }
        
        private void copyWaveFile(String inFilename,String outFilename){
                FileInputStream in = null;
                FileOutputStream out = null;
                long totalAudioLen = 0;
                long totalDataLen = totalAudioLen + 36;
                long longSampleRate = frequency;
                int channels = 2;
                long byteRate = RECORDER_BPP * frequency * channels/8;
                
                byte[] data = new byte[recBufSize];
                
                try {
                        in = new FileInputStream(inFilename);
                        out = new FileOutputStream(outFilename);
                        totalAudioLen = in.getChannel().size();
                        totalDataLen = totalAudioLen + 36;
                        
                        AppLog.logString("File size: " + totalDataLen);
                        
                        WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
                                        longSampleRate, channels, byteRate);
                        
                        while(in.read(data) != -1){
                                out.write(data);
                        }
                        
                        in.close();
                        out.close();
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }

        private void WriteWaveFileHeader(
                        FileOutputStream out, long totalAudioLen,
                        long totalDataLen, long longSampleRate, int channels,
                        long byteRate) throws IOException {
                
                byte[] header = new byte[44];
                
                header[0] = 'R';  // RIFF/WAVE header
                header[1] = 'I';
                header[2] = 'F';
                header[3] = 'F';
                header[4] = (byte) (totalDataLen & 0xff);
                header[5] = (byte) ((totalDataLen >> 8) & 0xff);
                header[6] = (byte) ((totalDataLen >> 16) & 0xff);
                header[7] = (byte) ((totalDataLen >> 24) & 0xff);
                header[8] = 'W';
                header[9] = 'A';
                header[10] = 'V';
                header[11] = 'E';
                header[12] = 'f';  // 'fmt ' chunk
                header[13] = 'm';
                header[14] = 't';
                header[15] = ' ';
                header[16] = 16;  // 4 bytes: size of 'fmt ' chunk
                header[17] = 0;
                header[18] = 0;
                header[19] = 0;
                header[20] = 1;  // format = 1
                header[21] = 0;
                header[22] = (byte) channels;
                header[23] = 0;
                header[24] = (byte) (longSampleRate & 0xff);
                header[25] = (byte) ((longSampleRate >> 8) & 0xff);
                header[26] = (byte) ((longSampleRate >> 16) & 0xff);
                header[27] = (byte) ((longSampleRate >> 24) & 0xff);
                header[28] = (byte) (byteRate & 0xff);
                header[29] = (byte) ((byteRate >> 8) & 0xff);
                header[30] = (byte) ((byteRate >> 16) & 0xff);
                header[31] = (byte) ((byteRate >> 24) & 0xff);
                header[32] = (byte) (2 * 16 / 8);  // block align
                header[33] = 0;
                header[34] = RECORDER_BPP;  // bits per sample
                header[35] = 0;
                header[36] = 'd';
                header[37] = 'a';
                header[38] = 't';
                header[39] = 'a';
                header[40] = (byte) (totalAudioLen & 0xff);
                header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
                header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
                header[43] = (byte) ((totalAudioLen >> 24) & 0xff);

                out.write(header, 0, 44);
        }
        
        private View.OnClickListener btnClick = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                        switch(v.getId()){
                                case R.id.btnRecord:{
                                        AppLog.logString("Start Recording");
                                        
                                        enableButton0(true);
                                        startRecording();
                                                        
                                        break;
                                }
                                case R.id.btnStop:{
                                        AppLog.logString("Start Recording");
                                        
                                        enableButton2(false);
                                        stopRecording();
                                        
                                        break;
                                }
                                case R.id.btnTrack:{
                                    AppLog.logString("Start Tracking");
                                    
                                    enableButton3(true);
                                    m_player = new PCMAudioTrack();
                         Log.i(TAG,"xxxxxxxxxxxxxxxxxxxxxxxxxxxx");
                         m_player.init();
                         m_player.start();
                                    
                                    break;
                                }
                                case R.id.btnStop2:{
                                    AppLog.logString("Stop Tracking");
                                    enableButton4(false);
                                    m_player.free();
                         m_player = null;
                                    
                                    break;
                                }
                                
                                
                        }
                }
        }; 
        
        public void createAudioRecord(){
     recBufSize = AudioRecord.getMinBufferSize(frequency,
     channelConfiguration, EncodingBitRate);

    
     audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,
     channelConfiguration, EncodingBitRate, recBufSize);    
     }
        
        public void createAudioTrack(){
         playBufSize=AudioTrack.getMinBufferSize(frequency,
     channelConfiguration, EncodingBitRate);

    
         audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,
     channelConfiguration, EncodingBitRate,
     playBufSize, AudioTrack.MODE_STREAM);
     }
        
        class PCMAudioTrack extends Thread {
        
         protected byte[] m_out_bytes;
        

         final String FILE_PATH = "/sdcard/AudioRecorder/";
         final String FILE_NAME = "session.wav";

         File file;
         FileInputStream in;
        
         public void init() {
         try {
         file = new File(FILE_PATH , FILE_NAME);
         file.createNewFile();
         in = new FileInputStream(file);

//         in.read(temp, 0, length);
        
         m_keep_running = true;

         createAudioTrack();

         m_out_bytes = new byte[playBufSize];

         } catch (Exception e) {
         e.printStackTrace();
         }
         }

         public void free() {
         m_keep_running = false;
         try {
         Thread.sleep(1000);
         } catch (Exception e) {
         Log.d("sleep exceptions...\n", "");
         }
         }

         public void run() {
         byte[] bytes_pkg = null;
         audioTrack.play();
         while (m_keep_running) {
         try {
         in.read(m_out_bytes);
         bytes_pkg = m_out_bytes.clone();
         audioTrack.write(bytes_pkg, 0, bytes_pkg.length);
         } catch (Exception e) {
         e.printStackTrace();
         }
         }

         audioTrack.stop();
         audioTrack = null;
         try {
         in.close();
         } catch (IOException e) {
         e.printStackTrace();
         }
         }
        }
        
        RadioGroup.OnCheckedChangeListener mChangeRadio1 =
         new RadioGroup.OnCheckedChangeListener() 
       { 
         @Override public void onCheckedChanged(RadioGroup group, int checkedId)
         { 
           // TODO Auto-generated method stub 
           if(checkedId==mRadio1.getId()) 
           { 
            
            channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_STEREO;
            
             } 
           else if(checkedId==mRadio2.getId())
           {
            
            channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
           }
         } 
     };
         
         RadioGroup.OnCheckedChangeListener mChangeRadio2 =
         new RadioGroup.OnCheckedChangeListener() 
       { 
         @Override public void onCheckedChanged(RadioGroup group, int checkedId)
         { 
           // TODO Auto-generated method stub 
           if(checkedId==mRadio3.getId()) 
           { 
            
            frequency = 44100;
             } 
           else if(checkedId==mRadio4.getId())
           {
            
            frequency = 22050;
           }
           else if(checkedId==mRadio5.getId())
           {
            
            frequency = 11025;
           }
         } 
      };

      RadioGroup.OnCheckedChangeListener mChangeRadio3 =
         new RadioGroup.OnCheckedChangeListener() 
       { 
         @Override public void onCheckedChanged(RadioGroup group, int checkedId)
         { 
           // TODO Auto-generated method stub 
           if(checkedId==mRadio6.getId()) 
           { 
            
            EncodingBitRate = AudioFormat.ENCODING_PCM_16BIT;
             } 
           else if(checkedId==mRadio7.getId())
           {
            
            EncodingBitRate = AudioFormat.ENCODING_PCM_8BIT;
           }
         } 
     };
    
     @Override
     protected void onDestroy() {
     super.onDestroy();
     android.os.Process.killProcess(android.os.Process.myPid());
     }
}

/************************/


录音回放代码:

public class Audioserver extends Thread
{  
    protected AudioTrack m_out_trk ;
    protected int        m_out_buf_size ;
    protected byte []    m_out_bytes ;
    protected boolean    m_keep_running ;
 private Socket s;
 private DataInputStream din;
 public void init()
 {
  try
     {
            s=new Socket("192.168.1.101",8888);
            din=new DataInputStream(s.getInputStream());
           
             m_keep_running = true ;
       
           
            m_out_buf_size = AudioTrack.getMinBufferSize(8000,
                             AudioFormat.CHANNEL_CONFIGURATION_MONO,
                             AudioFormat.ENCODING_PCM_16BIT);
            m_out_trk = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
                                       AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                       AudioFormat.ENCODING_PCM_16BIT,
                                       m_out_buf_size,
                                       AudioTrack.MODE_STREAM);
         
            m_out_bytes=new byte[m_out_buf_size];
           
           
     }
     catch(Exception e)
     {
      e.printStackTrace();
     }
 }
   
 public void free()
 {
  m_keep_running = false ;
        try {
            Thread.sleep(1000) ;
        } catch(Exception e) {
            Log.d("sleep exceptions...\n","") ;
        }
 }
 
  public void run()
  {
   byte [] bytes_pkg = null ;
         m_out_trk.play() ;
         while(m_keep_running) {
             try
             {
              din.read(m_out_bytes);
                 bytes_pkg = m_out_bytes.clone() ;
                 m_out_trk.write(bytes_pkg, 0, bytes_pkg.length) ;
             }
             catch(Exception e)
             {
              e.printStackTrace();
             }
            
         }
        
         m_out_trk.stop() ;
         m_out_trk = null ;
         try {
    din.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
}
分享到:
发表评论(7)
1楼 收藏  发表于  2013-3-11 20:24:52
收藏
2楼 荷兰网  发表于  2015-2-17 17:37:37
不错的文章,内容惟妙惟肖. 荷兰网 http://www.zhongguohelanwang.com/
3楼 ルイヴィトンコピーバッグ  发表于  2015-7-4 13:40:44
I was able to find good advice from your blog articles. ルイヴィトンコピーバッグ http://www.tfl.co.il/data/comune.asp?zq13gd9oj.htm
4楼 ルイヴィトンヴェルニバッグ中古  发表于  2015-7-5 20:13:44
If some one desires expert view about blogging after that i suggest him/her to pay a quick visit this weblog, Keep up the pleasant work. ルイヴィトンヴェルニバッグ中古 http://www.halongtourism.com.vn/tours.asp?tk83dq0ci.htm
5楼 ルイヴィトン財布ジッピーウォレット  发表于  2015-7-7 9:34:10
ルイヴィトン財布ジッピーウォレット http://www.smc-multimedia.com/wo.asp?ve10-yx2pn.htm,ルイヴィトンタイガボストンバッグ http://www.smc-multimedia.com/wo.asp?fz87-zv4ki.htm,ルイヴィトン長財布使い方 http://www.smc-multimedia.com/wo.asp?iw35-ab1ik.htm,ルイヴィトン財布メンズ激安 http://www.smc-multimedia.com/wo.asp?ad79-tb4vi.htm,ルイヴィトン財布スーパーコピー http://www.smc-multimedia.com/wo.asp?fy60-xf6zv.htm,ルイヴィトン長財布白 http://www.smc-multimedia.com/wo.asp?if99-mt2qm.htm,
6楼 ルイヴィトンヴェルニ財布新作  发表于  2015-7-7 17:54:27
Great article. I am going through some of these issues as well.. ルイヴィトンヴェルニ財布新作 http://www.print-rite.com/pnt.asp?ss86-dr1ll.htm
7楼 ルイヴィトンバッグ名前  发表于  2015-7-8 7:56:40
ルイヴィトンバッグ名前 http://crystalhues.com/images/gplus.asp?tk94-de7qb.htm, ルイヴィトンボディバッグ http://crystalhues.com/images/gplus.asp?cu44-tp8vf.htm, ルイヴィトン財布激安本物 http://crystalhues.com/images/gplus.asp?nx89-wv1am.htm, 財布ルイヴィトンモノグラム http://crystalhues.com/images/gplus.asp?tw25-fv2xb.htm, バッグルイヴィトン http://crystalhues.com/images/gplus.asp?iw90-rp3be.htm,
姓名 *
评论内容 *
验证码 *图片看不清?点击重新得到验证码