簡體   English   中英

在Android上錄音時出錯

[英]An error upon audio recording on Android

我的應用程序啟動thread A來保存一些數據。 在此線程中,我調用函數startRecording(audioFile.getAbsolutePath());

但是我收到以下錯誤:

start called in an invalid state: 16; at android.media.MediaRecorder.start(Native Method)

並非每次都會發生此錯誤,但是有時我會從應用程序中獲取此錯誤報告。

下面是我的代碼。

public void startRecording(String outputPath) {
    if (recorder == null) {
        recorder = new MediaRecorder();
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        recorder.setAudioSamplingRate(RECORDER_SAMPLERATE_22050);
        recorder.setOutputFile(outputPath);
        try {
            recorder.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    recorder.start();
    SampleRecordThread thread = new SampleRecordThread(outputPath);
    thread.start();

}

private class SampleRecordThread extends Thread {
    private volatile boolean running = true;

    public void exit() {
        running = false;
    }

    @Override
public void run() {
    while (running) {
        try {
            Thread.sleep(10 * 1000);//to record 10 seconds sound
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        recorder.stop();
        recorder.reset();
        recorder.release();
        recorder = null;

        // upload the data to cloud
        if (isWifiActive && isInstallationSaved) {
                    .....
                    record.saveInBackground();
            }

        break;
    }
}

我認為您嘗試在以前的錄像機未停止和釋放的情況下進行錄像可以使用我的課程

public class AudioRecordManager {

public interface OnAudioRecordCallback {

    void onComplete(String path);

    void onFailed(int code);

}

private OnAudioRecordCallback onAudioRecordCallback;

public void setOnAudioRecordCallback(OnAudioRecordCallback onAudioRecordCallback) {
    this.onAudioRecordCallback = onAudioRecordCallback;
}

private MediaRecorder myRecorder;
private String outputFile;
private AudioRecordThread audioRecordThread;

public AudioRecordManager() {
    audioRecordThread = new AudioRecordThread();
}

private AudioRecordThread audioRecordThread;

public void startRecord() {
    if(audioRecordThread == null || !audioRecordThread.isRunning()){
        new Thread(audioRecordThread).start();
    }
}

public void stopRecord() {
    if(audioRecordThread!=null && audioRecordThread.isRunning()) {
        audioRecordThread.stopRecording();
    }
}

class AudioRecordThread implements Runnable {

    private boolean isRunning;

    private boolean isStop;

    private long startTime;

    private void startRecord() {
        isRunning = true;
        isStop = false;
        File folder = new File(Content.AUDIO_DIR);
        if (!folder.exists()) {
            boolean b = folder.mkdirs();
        }
        startTime = System.currentTimeMillis();
        outputFile = folder.getPath() + "/rec_" + startTime + ".mp3";

        myRecorder = new MediaRecorder();
        myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        myRecorder.setOutputFile(outputFile);
        try {
            myRecorder.prepare();
            myRecorder.start();

            startTime = System.currentTimeMillis();

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

    private void stopRecord() {

        final long stopTime = System.currentTimeMillis();

        try {
            if(System.currentTimeMillis() - startTime < 500){
                try{
                    Thread.sleep(500);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            myRecorder.stop();

            myRecorder.release();
            myRecorder = null;
        } catch (Exception e) {
            myRecorder = null;
            e.printStackTrace();
        }

        if (stopTime - startTime > 1000) {
            if (onAudioRecordCallback != null) {
                onAudioRecordCallback.onComplete(outputFile);
            }
        } else {
            File current = new File(outputFile);
            current.delete();
            if (onAudioRecordCallback != null) {
                onAudioRecordCallback.onFailed(2);
            }
        }

        isRunning = false;
    }

    @Override
    public void run() {
        startRecord();
        while (!isStop) {
            try {
                Thread.sleep(30);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        stopRecord();
    }

    public void stopRecording() {
        isStop = true;
    }

    public boolean isRunning() {
        return isRunning;
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM