Android 如何录制播放时的部分声音
我对安卓系统中的音频录制有一个棘手的问题。当我和手机通话时,我用AudioTrack播放我的声音。如果我按“录制”按钮,我想录制声音中的一部分。例如,我将在10秒内发言。但是,我只想在按下录制按钮时录制声音。它可以是从第3秒到第8秒。但是,我的手机需要在我说话时播放声音(从1秒到10秒) 目前,我使用一个线程来播放我的声音,如下代码所示。我在录制线程中创建了一个标志来决定何时录制。当我按下“记录”按钮时,该标志将设置为真。我点击停止,它将设置为false并写入文件Android 如何录制播放时的部分声音,android,multithreading,audio,audio-recording,audiotrack,Android,Multithreading,Audio,Audio Recording,Audiotrack,我对安卓系统中的音频录制有一个棘手的问题。当我和手机通话时,我用AudioTrack播放我的声音。如果我按“录制”按钮,我想录制声音中的一部分。例如,我将在10秒内发言。但是,我只想在按下录制按钮时录制声音。它可以是从第3秒到第8秒。但是,我的手机需要在我说话时播放声音(从1秒到10秒) 目前,我使用一个线程来播放我的声音,如下代码所示。我在录制线程中创建了一个标志来决定何时录制。当我按下“记录”按钮时,该标志将设置为真。我点击停止,它将设置为false并写入文件 public clas
public class AudioSoundThread extends Thread {
private short[] audioBuffer;
private boolean isRecording = false;
private boolean isSounding = true;
private AudioRecordingHandler handler = null;
private AudioRecord record;
private AudioTrack track;
public AudioSoundThread(AudioTrack mtrack,AudioRecord mrecord,short[] maudioBuffer, AudioRecordingHandler handler) {
this.handler = handler;
this.audioBuffer = maudioBuffer;
this.record=mrecord;
this.track=mtrack;
}
@Override
public void run() {
record.startRecording();
DataOutputStream output =null;
if(isRecording){
output = prepareWriting();
if (output == null) { return; }
}
track.play();
///////////Play during recording
int readSize =0;
while (isSound) {
readSize=record.read(audioBuffer, 0, audioBuffer.length);
if ((readSize == AudioRecord.ERROR_INVALID_OPERATION) ||
(readSize == AudioRecord.ERROR_BAD_VALUE) ||
(readSize <= 0)) {
continue;
}
if(AudioRecord.ERROR_INVALID_OPERATION != readSize){
track.write(audioBuffer, 0, readSize);
}
if(isRecording)
write(output,readSize);
//Finished to write
if(!isRecording&&output!=null)
{
finishWriting(output);
File waveFile = getFile("wav");
try {
rawToWave(mRecording, waveFile);
deleteTempFile(mRecording);
} catch (IOException e) {
Log.e("Error writing file : ", e.getMessage());
}
}
}
record.stop();
record.release();
}
public synchronized void stopSound() {
isSound = false;
}
public synchronized void startSound() {
isSound = true;
}
public synchronized void startRecordingFlag() {
isRecording = true;
}
public synchronized void stopRecording() {
isRecording = false;
}
private void finishWriting(DataOutputStream out) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
if (handler != null) {
handler.onRecordingError();
}
}
}
private DataOutputStream prepareWriting() {
if (mRecording.exists()) { mRecording.delete(); }
DataOutputStream out = null;
try {
out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(mRecording)));
} catch (FileNotFoundException e) {
e.printStackTrace();
if (handler != null) {
handler.onRecordingError();
}
}
return out;
}
然而,我的计划不起作用。我认为我的旗帜无法发送到线程。你能看一下我的代码并给我一个解决方案吗?但是当
if(isRecording)
true时什么也不做?实际上,它将有一些东西可以原始编写并将其转换为wav。代码太长,无法发布。如果你感兴趣的话,我会把它贴出来。我用一些旗子解决了它。这很不方便,但很简单
private AudioSoundThread recordingThread;
//Play button
btnPlay = (Button) findViewById(R.id.btnPlay);
btnPlay.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startSounding();
}
});
//Record button
btnRecord = (Button) findViewById(R.id.btnRecord);
btnRecord.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//record();
recordingThread.startRecordingFlag();
}
});
//Stop Record button
btnStopRecord = (Button) findViewById(R.id.btnStopRecord);
btnStopRecord .setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//record();
recordingThread.stopRecording();
}
});
private void startSounding() {
soundingThread = new AudioSoundThread(track,mRecorder,mBuffer,new AudioRecordingHandler() {
});
soundingThread.start();
}