android AudioRecord class 录制音频并播放
android AudioRecord class to record an audio and play it back
我想录制音频并以 WAV 格式播放。我必须使用 AudioRecord 来完成。有人可以帮我吗?
我经历了这个例子,
http://androidsourcecode.blogspot.com.au/2013/07/android-audio-demo-audiotrack.html
我不明白通话模式和扬声器模式的作用。有人可以解释一下吗?
这部分代码在link,
private void recordAndPlay() {
short[] lin = new short[1024];
int num = 0;
am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
am.setMode(AudioManager.MODE_IN_COMMUNICATION);
record.startRecording();
track.play();
while (true) {
num = record.read(lin, 0, 1024);
track.write(lin, 0, num);
}
}
num = record.read(lin, 0, 1024); is recording the audio.
track.play(); -- Plays the audio.
track.write(lin, 0, num); -- streams the audio
不知道我理解的对不对,但是我的理解是
record.startRecording(); -- Audio is recording
track.play(); -- playing the audio
while (true) {
num = record.read(lin, 0, 1024); -- Record gets stored
track.write(lin, 0, num); -- play the audio
}
录流和放流同时进行?我该如何测试?
我想自己回答我的问题
上面代码中的recordAndPlay方法,同时录制和播放声音。
我拆分了代码。我先把声音录下来存到文件里,然后打开存好的文件处理播放出来的声音。
private void startRecording() {
final int CHANNELCONFIG = AudioFormat.CHANNEL_IN_MONO;
String filename = getTempFilename();
OutputStream os = null;
try {
os = new FileOutputStream(filename);
} catch(FileNotFoundException e) {
e.printStackTrace();
}
bufferSize = AudioRecord.getMinBufferSize(FREQUENCY,CHANNELCONFIG,AUDIO_FORMAT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,FREQUENCY,CHANNELCONFIG,AUDIO_FORMAT,bufferSize);
audioData = new byte[bufferSize];
audioRecord.startRecording();
int read = 0;
while (recording) {
read = audioRecord.read(audioData,0,bufferSize);
if(AudioRecord.ERROR_INVALID_OPERATION != read){
try {
os.write(audioData);
} catch (IOException e) {
e.printStackTrace();
}
}
}
try {
os.close();
} catch (IOException io) {
io.printStackTrace();
}
}
private void playRecording() {
String fileName = getFilename();
File file = new File(fileName);
byte[] audioData = null;
try {
InputStream inputStream = new FileInputStream(fileName);
int minBufferSize = AudioTrack.getMinBufferSize(44100,AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
audioData = new byte[minBufferSize];
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,FREQUENCY,AudioFormat.CHANNEL_OUT_MONO,AUDI O_FORMAT,minBufferSize,AudioTrack.MODE_STREAM);
audioTrack.play();
int i=0;
while((i = inputStream.read(audioData)) != -1) {
audioTrack.write(audioData,0,i);
}
} catch(FileNotFoundException fe) {
Log.e(LOG_TAG,"File not found");
} catch(IOException io) {
Log.e(LOG_TAG,"IO Exception");
}
}
我想录制音频并以 WAV 格式播放。我必须使用 AudioRecord 来完成。有人可以帮我吗?
我经历了这个例子,
http://androidsourcecode.blogspot.com.au/2013/07/android-audio-demo-audiotrack.html
我不明白通话模式和扬声器模式的作用。有人可以解释一下吗?
这部分代码在link,
private void recordAndPlay() {
short[] lin = new short[1024];
int num = 0;
am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
am.setMode(AudioManager.MODE_IN_COMMUNICATION);
record.startRecording();
track.play();
while (true) {
num = record.read(lin, 0, 1024);
track.write(lin, 0, num);
}
}
num = record.read(lin, 0, 1024); is recording the audio.
track.play(); -- Plays the audio.
track.write(lin, 0, num); -- streams the audio
不知道我理解的对不对,但是我的理解是
record.startRecording(); -- Audio is recording
track.play(); -- playing the audio
while (true) {
num = record.read(lin, 0, 1024); -- Record gets stored
track.write(lin, 0, num); -- play the audio
}
录流和放流同时进行?我该如何测试?
我想自己回答我的问题
上面代码中的recordAndPlay方法,同时录制和播放声音。
我拆分了代码。我先把声音录下来存到文件里,然后打开存好的文件处理播放出来的声音。
private void startRecording() {
final int CHANNELCONFIG = AudioFormat.CHANNEL_IN_MONO;
String filename = getTempFilename();
OutputStream os = null;
try {
os = new FileOutputStream(filename);
} catch(FileNotFoundException e) {
e.printStackTrace();
}
bufferSize = AudioRecord.getMinBufferSize(FREQUENCY,CHANNELCONFIG,AUDIO_FORMAT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,FREQUENCY,CHANNELCONFIG,AUDIO_FORMAT,bufferSize);
audioData = new byte[bufferSize];
audioRecord.startRecording();
int read = 0;
while (recording) {
read = audioRecord.read(audioData,0,bufferSize);
if(AudioRecord.ERROR_INVALID_OPERATION != read){
try {
os.write(audioData);
} catch (IOException e) {
e.printStackTrace();
}
}
}
try {
os.close();
} catch (IOException io) {
io.printStackTrace();
}
}
private void playRecording() {
String fileName = getFilename();
File file = new File(fileName);
byte[] audioData = null;
try {
InputStream inputStream = new FileInputStream(fileName);
int minBufferSize = AudioTrack.getMinBufferSize(44100,AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
audioData = new byte[minBufferSize];
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,FREQUENCY,AudioFormat.CHANNEL_OUT_MONO,AUDI O_FORMAT,minBufferSize,AudioTrack.MODE_STREAM);
audioTrack.play();
int i=0;
while((i = inputStream.read(audioData)) != -1) {
audioTrack.write(audioData,0,i);
}
} catch(FileNotFoundException fe) {
Log.e(LOG_TAG,"File not found");
} catch(IOException io) {
Log.e(LOG_TAG,"IO Exception");
}
}