读书人

运用AudioRecord和AudioTrack来录制和

发布时间: 2013-04-09 16:45:09 作者: rapoo

使用AudioRecord和AudioTrack来录制和播放音频
1.使用AudioRecord录制原始音频

除了通过意图启动录音机和使用MediaRecorder之外,Android还提供了第三种方法来捕获音频:使用成为AudioRecord的类。AudioRecord是三种方法里最灵活的(因为允许访问原始音频流),但是它拥有的内置功能也是最少的,如不会自动压缩音频。

使用AudioRecord的基础知识非常简单。我们只需要构造一个AudioRecord类型的对象,并传入各种不同的配置参数。

需要指定的第一个值是音频源。下面使用的值与用于MediaRecorder的值相同,其在MediaRecorder.AudioSource中定义。实际上,这意味着可以使用MediaRecorder.AudioSource.MIC。

public class AltAudioRecorder extends Activity implements OnClickListener{RecordAudio recordTask;PlayAudio playTask;Button startRecordingButton, stopRecordingButton, startPlaybackButton,stopPlaybackButton;TextView statusText;File recordingFile;boolean isRecording = false;boolean isPlaying = false;int frequency = 11025;int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);statusText = (TextView) this.findViewById(R.id.StatusTextView);startRecordingButton = (Button) this.findViewById(R.id.StartRecordingButton);stopRecordingButton = (Button) this.findViewById(R.id.StopRecordingButton);startPlaybackButton = (Button) this.findViewById(R.id.StartPlaybackButton);stopPlaybackButton = (Button) this.findViewById(R.id.StopPlaybackButton);startRecordingButton.setOnClickListener(this);stopRecordingButton.setOnClickListener(this);startPlaybackButton.setOnClickListener(this);stopPlaybackButton.setOnClickListener(this);stopRecordingButton.setEnabled(false);startPlaybackButton.setEnabled(false);stopPlaybackButton.setEnabled(false);File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/Android/data/AudioRecorder/files/");path.mkdirs();try{recordingFile = File.createTempFile("recording", ".pcm", path);} catch (IOException e){throw new RuntimeException("Couldn't create file on SD card", e);}}public void onClick(View v){if (v == startRecordingButton){record();} else if (v == stopRecordingButton){stopRecording();} else if (v == startPlaybackButton){play();} else if (v == stopPlaybackButton){stopPlaying();}}public void play(){startPlaybackButton.setEnabled(true);playTask = new PlayAudio();playTask.execute();stopPlaybackButton.setEnabled(true);}public void stopPlaying(){isPlaying = false;stopPlaybackButton.setEnabled(false);startPlaybackButton.setEnabled(true);}public void record(){startRecordingButton.setEnabled(false);stopRecordingButton.setEnabled(true);// For FunstartPlaybackButton.setEnabled(true);recordTask = new RecordAudio();recordTask.execute();}public void stopRecording(){isRecording = false;}private class PlayAudio extends AsyncTask<Void, Integer, Void>{@Overrideprotected Void doInBackground(Void... params){isPlaying = true;int bufferSize = AudioTrack.getMinBufferSize(frequency,channelConfiguration, audioEncoding);short[] audiodata = new short[bufferSize / 4];try{DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(recordingFile)));AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,channelConfiguration, audioEncoding, bufferSize,AudioTrack.MODE_STREAM);audioTrack.play();while (isPlaying && dis.available() > 0){int i = 0;while (dis.available() > 0 && i < audiodata.length){audiodata[i] = dis.readShort();i++;}audioTrack.write(audiodata, 0, audiodata.length);}dis.close();startPlaybackButton.setEnabled(false);stopPlaybackButton.setEnabled(true);} catch (Throwable t){Log.e("AudioTrack", "Playback Failed");}return null;}}private class RecordAudio extends AsyncTask<Void, Integer, Void>{@Overrideprotected Void doInBackground(Void... params){isRecording = true;try{DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(recordingFile)));int bufferSize = AudioRecord.getMinBufferSize(frequency,channelConfiguration, audioEncoding);AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,channelConfiguration, audioEncoding, bufferSize);short[] buffer = new short[bufferSize];audioRecord.startRecording();int r = 0;while (isRecording){int bufferReadResult = audioRecord.read(buffer, 0,bufferSize);for (int i = 0; i < bufferReadResult; i++){dos.writeShort(buffer[i]);}publishProgress(new Integer(r));r++;}audioRecord.stop();dos.close();} catch (Throwable t){Log.e("AudioRecord", "Recording Failed");}return null;}protected void onProgressUpdate(Integer... progress){statusText.setText(progress[0].toString());}protected void onPostExecute(Void result){startRecordingButton.setEnabled(true);stopRecordingButton.setEnabled(false);startPlaybackButton.setEnabled(true);}}}




读书人网 >移动开发

热点推荐