2014-02-03 3 views
0

Я хочу записывать звук PCM в течение нескольких часов, но я хочу сохранить только последние 5 минут записи при нажатии кнопки STOP. Значение, когда START нажата, и запись достигла 5 минут, следующим шагом будет удаление начала записи и добавление дополнительного буфера чтения в запись, чтобы 5 минут всегда оставались неизменными. Мне нужно сделать это с помощью AudioRecord.как записывать PCM в течение нескольких часов, но сохранять только последние 5 минут записи при остановке?

Я попытался использовать класс AudioRecord для записи 20 секунд вместо 5 минут. Я читал байты в один большой байтовый [] буфер. При нажатии кнопки START байты считываются в байт [] буфера, и когда 20 секунд достигнуты, он начинает перезаписывать буфер байта [] с начала, когда 40 секунд достигнуты, он снова начинает перезаписывать байт [] с начала, когда STOP нажат I перестроить буфер байта [] в правильную последовательность и записать в файл. Этот метод работает, но с его использованием мне нужно выделить память для байтового [] буфера с самого начала, а 5 минут слишком велики, я ударил ограничение размера кучи и закончил память. Я делаю это, используя частоту дискретизации 44100 Гц.

Итак, есть ли лучший способ сделать запись 5min, как описано выше, не выделяя слишком много памяти?

+0

Я предполагаю, что для любого используемого вами метода потребуется как минимум этот объем памяти. – Keppil

+0

Вы можете избежать ограничения размера кучи java с собственным распределением в jni-коде и циклическим буфером, реализованным там, однако вы все еще работаете на устройстве с ограниченной памятью и убийцей OOM, который будет с энтузиазмом отправлять фоновые процессы, когда он заканчивается память для передних. Более низкая частота дискретизации или моно уменьшила бы потребность в памяти, поскольку, конечно же, было бы уже упомянутое сжатие. –

ответ

1

Если у вас недостаточно памяти, у вас есть два варианта.

Первый выбор заключается в том, чтобы использовать диск в качестве буфера, если он у вас есть, это просто, но если ваш диск основан на флеш-памяти, вы будете носить его без причины.

Второй вариант - сжать. Если вам не нужен PCM, вы можете закодировать его как MP3. Если вам нужен PCM, могут быть другие варианты. Звук очень избыточный и должен быть довольно сжимаемым, даже без потерь. Но рано или поздно вы достигнете предела своей оперативной памяти.

0

Записать его в файл, а не хранить его в памяти?

+0

Имейте в виду, что я должен записывать несколько часов. При нажатии STOP сохраняются только последние 5 минут. PCM-файл занимает много места, записывая его в течение нескольких часов, это не очень хорошая идея. – newCode

+1

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

+1

Что вы сказали о классе AudioRecord, возвращающемся к началу и переписывании ... Это иногда называют «циклическим буфером». Бадди probaby предназначался для вас, чтобы реализовать круговой буфер в файле. То есть, через пять минут, вернитесь к началу файла и продолжайте переписывать его. –

Смежные вопросы