Как извлечь часть записанных байтов аудио - PullRequest
0 голосов
/ 10 июля 2020

Я записываю звук в массив байтов, см. Ниже:

    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
    recorder.setAudioSamplingRate(44100);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setAudioEncodingBitRate(1024*1024);

...

    while (hasRecording) {
        try {
            int read = inputStream.read(data, 0, data.length);
            if (read == -1)
                break;

            byteArrayOutputStream.write(data, 0, read);
            byteArrayOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Во время записи я рисую амплитуду в диаграмме (на лету). После остановки записи пользователь может выбрать часть графика. А теперь как по выбору пользователя извлечь часть байтового массива? У меня есть только позиция выбранных координат и байтовый массив завершенного записанного звука. Я знаю, что мне нужно рассчитать битрейт для позиции в байтовом массиве, но я не знаю, как это сделать.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Можете ли вы определить количество байтов в кадре? Я вижу, что у вас 44100 кадров в секунду. Но я обычно не работаю со звуком с точки зрения битрейта и не понимаю, к чему это относится.

В чистом контексте Java AudioFormat определяется в терминах битов, используемых для кодирование, при этом 16 бит (два байта) являются наиболее распространенными, и количество каналов, например, 1 канал для моно, 2 канала для стерео.

С так называемым общим форматом «Качество CD» , у нас 16-битное кодирование и стерео, то есть 4 байта на кадр. Исходя из этого и частоты кадров, легко сопоставить указанный c байт с моментом времени.

0 голосов
/ 10 июля 2020

Если массив имеет размер N и содержит T секунд аудиоданных (от t = 0 до t = T), то данные в момент времени t будут иметь индекс t * N / T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...