MediaRecorder иногда производит разрыв нулей на Nougat + - PullRequest
0 голосов
/ 09 июля 2019

Я использую MediaRecorder для записи звука с Android-устройств (в основном Galaxy S6).Я заметил, что в некоторых (3-5%) моих записях (у меня сейчас тысячи) части записи не имеют звука, но содержат множество нулей, которые могут длиться до минуты.В остальном запись нормальная.

Zeros in otherwise normal recording

Впервые я заметил эту проблему некоторое время назад при использовании AudioRecorder.В то время я думал, что AudioRecorder был причиной проблемы, и переключился на MediaRecorder.Я протестировал несколько файлов, и проблема казалась решенной.Однако я запустил скрипт, чтобы снова проверить все мои записи, и снова могут появиться файлы, содержащие нули.

При исследовании решений этой проблемы возникает только одна вещь: AudioRecord, создающий пробелы в нуле на Android 5.01 .Однако эта ошибка должна была быть исправлена ​​в Android 5.1.

Я записываю файлы непосредственно во внешнее хранилище файлов и использую MPEG_4 с кодировкой AAC.Я приобретаю Wake Lock, чтобы поворачивать экран, когда пользователь подносит телефон к уху.

Регистратор

public void startRecording(String fileName){
        recorder = new MediaRecorder();
        recorder.setAudioSource(0); //0,1,5,6,7
        recorder.setAudioChannels(1);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setOutputFile(fileName);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        recorder.setAudioEncodingBitRate(320000);
        recorder.setAudioSamplingRate(44100);
        try {
            recorder.prepare();
        } catch (IOException e) {
            Log.e(TAG,"startRecording failed: " + e);
        }
        recorder.start();
    }

 public void stopRecording(){
        recorder.stop();
        recorder.release();
        recorder = null;
    }

Wake Lock

protected void getWakeLock() {
    if (wl == null) {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        this.wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "doWork()");
        wl.setReferenceCounted(false);
        if (!wl.isHeld()) {
            wl.acquire();
            Log.e(TAG,"Acquired wake lock!");
        }
    } else {
        if (!wl.isHeld()) {
            wl.acquire();
        }
    }
}

private void releaseWakeLock() {
    if (wl != null) {
        if (wl.isHeld()) {
            Log.e(TAG,"We have a wake lock....Releasing wake lock...");
            wl.release();
        }
    }
}

Есть ли у кого-нибудь какие-либо идеи относительно возможной причинывопрос?

...