Запись звука обратно на наушники имеет задержку - PullRequest
0 голосов
/ 06 марта 2020

Я хочу создать приложение, подобное starMaker. Вот мой код Я запускаю задачу Asyn c, которая выполняет следующие действия:

  1. Запись аудио
  2. Сохранение в формате .Wav
  3. Добавление звука обратно в наушники.

Проблема

Задержка при возврате к моим наушникам. Как убрать эту задержку? Может кто-нибудь помочь мне устранить эту задержку?

protected Object[] doInBackground(File... files) {
        AudioRecord audioRecord = null;
        FileOutputStream wavOut = null;
        AudioTrack aud;
        long startTime = 0;
        long endTime = 0;

        try {
            audioRecord = new AudioRecord(AUDIO_SOURCE, SAMPLE_RATE, CHANNEL_MASK, ENCODING, BUFFER_SIZE);
            wavOut = new FileOutputStream(files[0]);

            aud = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, ENCODING, BUFFER_SIZE, AudioTrack.MODE_STREAM);
            aud.play();
            // Write out the wav file header
            writeWavHeader(wavOut, CHANNEL_MASK, SAMPLE_RATE, ENCODING);

            // Avoiding loop allocations
            byte[] buffer = new byte[BUFFER_SIZE];
            boolean run = true;
            int read;
            long total = 0;

            startTime = SystemClock.elapsedRealtime();
            audioRecord.startRecording();
            while (run && !isCancelled()) {
                read = audioRecord.read(buffer, 0, buffer.length);

                // WAVs cannot be > 4 GB due to the use of 32 bit unsigned integers.
                if (total + read > 4294967295L) {
                    // Write as many bytes as we can before hitting the max size
                    for (int i = 0; i < read && total <= 4294967295L; i++, total++) {
                        aud.write(buffer, 0, read);
                        wavOut.write(buffer[i]);
                    }
                    run = false;
                } else {
                    // Write out the entire read buffer
                    aud.write(buffer, 0, read);
                    wavOut.write(buffer, 0, read);
                    total += read;
                }
            }
        } catch (IOException ex) {
            return new Object[]{ex};
        } finally {
            if (audioRecord != null) {
                try {
                    if (audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) {
                        audioRecord.stop();
                        endTime = SystemClock.elapsedRealtime();
                    }
                } catch (IllegalStateException ex) {
                    //
                }
                if (audioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
                    audioRecord.release();
                }
            }
            if (wavOut != null) {
                try {
                    wavOut.close();
                } catch (IOException ex) {
                    //
                }
            }
        }

        try {
            // This is not put in the try/catch/finally above since it needs to run
            // after we close the FileOutputStream
            updateWavHeader(files[0]);
        } catch (IOException ex) {
            return new Object[]{ex};
        }

        return new Object[]{files[0].length(), endTime - startTime};
    }

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

...