Android: нужно записывать микрофонный ввод - PullRequest
39 голосов
/ 05 августа 2011

Есть ли способ записи микрофонного входа на Android, пока он обрабатывается для воспроизведения / предварительного просмотра в реальном времени?Я пытался использовать AudioRecord и AudioTrack для этого, но проблема в том, что мое устройство не может воспроизвести записанный аудиофайл.Фактически, ни одно приложение проигрывателя Android не может воспроизвести записанный аудиофайл.

С другой стороны, использование Media.Recorder для записи создает хороший записанный аудиофайл, который может быть воспроизведен любым приложением проигрывателя.Но дело в том, что я не могу сделать предварительный просмотр / прослушивание во время записи микрофонного входа в реальном времени.

Любая обратная связь очень ценится!Заранее спасибо!

Ответы [ 2 ]

63 голосов
/ 11 августа 2011

Для записи и воспроизведения аудио в (почти) реальном времени вы можете запустить отдельный поток и использовать AudioRecord и AudioTrack.

Просто будьте осторожны с обратной связью.Если громкоговорители на вашем устройстве включены достаточно громко, обратная связь может быть довольно неприятной и довольно быстрой.файл.Объект AudioRecord кодирует аудио как 16-битные данные PCM и помещает его в буфер.Затем объект AudioTrack считывает данные из этого буфера и воспроизводит их через динамики.На SD-карте нет файла, к которому вы сможете получить доступ позже.

Вы не можете одновременно читать и записывать файл с SD-карты, чтобы воспроизводить / просматривать в реальном времени, поэтомуВы должны использовать буферы.

11 голосов
/ 22 сентября 2013

Для правильной работы требуется следующее разрешение в манифесте:

<uses-permission android:name="android.permission.RECORD_AUDIO" ></uses-permission>

Кроме того, 2d буферный массив не требуется. Логика кода верна даже с одним буфером, например так:

short[] buffer = new short[160];
while (!stopped) {
    //Log.i("Map", "Writing new data to buffer");
    int n = recorder.read(buffer, 0, buffer.length);
    track.write(buffer, 0, n);
}
...