Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何录制播放时的部分声音_Android_Multithreading_Audio_Audio Recording_Audiotrack - Fatal编程技术网

Android 如何录制播放时的部分声音

Android 如何录制播放时的部分声音,android,multithreading,audio,audio-recording,audiotrack,Android,Multithreading,Audio,Audio Recording,Audiotrack,我对安卓系统中的音频录制有一个棘手的问题。当我和手机通话时,我用AudioTrack播放我的声音。如果我按“录制”按钮,我想录制声音中的一部分。例如,我将在10秒内发言。但是,我只想在按下录制按钮时录制声音。它可以是从第3秒到第8秒。但是,我的手机需要在我说话时播放声音(从1秒到10秒) 目前,我使用一个线程来播放我的声音,如下代码所示。我在录制线程中创建了一个标志来决定何时录制。当我按下“记录”按钮时,该标志将设置为真。我点击停止,它将设置为false并写入文件 public clas

我对安卓系统中的音频录制有一个棘手的问题。当我和手机通话时,我用AudioTrack播放我的声音。如果我按“录制”按钮,我想录制声音中的一部分。例如,我将在10秒内发言。但是,我只想在按下录制按钮时录制声音。它可以是从第3秒到第8秒。但是,我的手机需要在我说话时播放声音(从1秒到10秒)

目前,我使用一个线程来播放我的声音,如下代码所示。我在录制线程中创建了一个标志来决定何时录制。当我按下“记录”按钮时,该标志将设置为真。我点击停止,它将设置为false并写入文件

    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();
}