Использование Java Queues в аудио приложении в реальном времени
Я пишу аудио приложение в Android, которое записывает аудио с использованием AudioRecord
и в настоящее время я сохраняю записанный звук в виде файла WAV. Теперь я хочу закодировать эти аудиоданные, чтобы сохранить их в сжатом виде. Для сжатия я использую MediaCodec
сжать необработанные биты в AAC (с контейнером ADST). Сейчас я сначала сохраняю записанные данные в .wav
файл, а затем считывание всего в реализованный класс кодировщика и его кодирование. Я хочу пропустить этот шаг первого сохранения файла как .wav
, Итак, я думаю о том, чтобы реализовать какую-то очередь для хранения записанных сэмплов в моем классе, которая записывает аудио и продолжает опрашивать эту очередь из моего класса кодировщика. Вопрос в том, что я должен использовать Queue
предоставляется SDK или я должен реализовать свою собственную очередь с использованием массивов? Проблема, с которой я могу столкнуться, заключается в том, что Queue
предоставляемый SDK может привести к возможным издержкам и может привести к потере некоторых семплов во время записи, поскольку метод, в котором я читаю аудиоданные и сохраняю их для дальнейшего использования, находится в synchronized
блок:
synchronized (lock) {
while (mIsRecording) {
// reading the audio buffer from the audio recording object
mAudioRecord.read(mBuffer, 0, mBufferSize / SHORT_SIZE);
// adding the audio buffer to the recording data ...
System.arraycopy(mBuffer, 0, mRecAudioData, mRecAudioDataIndex, mBuffer.length);
// increment the starting index for next copy..
mRecAudioDataIndex += mBuffer.length;
processBuffer(mBuffer);
}
}
Прямо сейчас я сохраняю аудиоданные в виде массива для последующего сохранения в файл wav. Как объяснено выше, теперь я хочу поставить в очередь прочитанные данные (mBuffer
) в очередь и использовать его в кодировщике. Как мне реализовать очередь? Какие-либо предложения?