Java: постоянно записывать аудио и сохранять последнюю часть - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу непрерывно записывать звук и, когда пользователь нажимает кнопку, сохранить последние 4 секунды записанного звука.

Я использовал эту ссылку для записи своего аудио, но проблемы, с которыми я сейчас сталкиваюсь:

  • Я не знаю, как долго я могу записывать для.
  • Что происходит при заполнении короткого или байтового массива.
  • Как сохранить только последние записанные 4 секунды.

мой текущий код для записиаудио:

private static final int RECORDER_SAMPLERATE = 8000;
    private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
    private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
    private AudioRecord recorder;
    private boolean isRecording = false;
    private int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024
    private short sData[];

    public short[] getRocordingShort(){
        return sData;
    }

    public byte[] getRocordingByte(){
        return short2byte(sData);
    }

    public Recorder(){
        recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                RECORDER_SAMPLERATE, RECORDER_CHANNELS,
                RECORDER_AUDIO_ENCODING, BufferElements2Rec * 2);// 2 bytes in 16bit format
    }

    public void startRecording() {
        sData = new short[BufferElements2Rec];
        recorder.startRecording();
        isRecording = true;
        Thread recordingThread = new Thread(new Runnable() {
            public void run() {
                while (isRecording) {
                    // gets the voice output from microphone to byte format
                    recorder.read(sData, 0, BufferElements2Rec);
                }
            }
        }, "AudioRecorder Thread");
        recordingThread.start();
    }

    //convert short to byte
    private byte[] short2byte(short[] sData) {
        int shortArrsize = sData.length;
        byte[] bytes = new byte[shortArrsize * 2];
        for (int i = 0; i < shortArrsize; i++) {
            bytes[i * 2] = (byte) (sData[i] & 0x00FF);
            bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
            sData[i] = 0;
        }
        return bytes;

    }

    public void stopRecording() {
        // stops the recording activity
        if (recorder != null) {
            isRecording = false;
            recorder.stop();
            /*recorder.release();
            recorder = null;
            recordingThread = null;*/
        }
    }
...