Использование libvorbis с iOS Core Audio и AudioBuffer

Я успешно использую libvorbis в проектах xcode для кодирования файлов wav. Теперь я пытаюсь кодировать данные AudioBuffer, отправленные через аудиоустройства. Например, для кодирования входа микрофона. Описание AudioStreamBasicDescription, которое я использую, является стандартным линейным PCM:

+ (AudioStreamBasicDescription)nonInterleavedFloatStereoAudioDescription {
    AudioStreamBasicDescription audioDescription;
    memset(&audioDescription, 0, sizeof(audioDescription));
    audioDescription.mFormatID          = kAudioFormatLinearPCM;
    audioDescription.mFormatFlags       = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked | kAudioFormatFlagIsNonInterleaved;
    audioDescription.mChannelsPerFrame  = 2;
    audioDescription.mBytesPerPacket    = sizeof(float);
    audioDescription.mFramesPerPacket   = 1;
    audioDescription.mBytesPerFrame     = sizeof(float);
    audioDescription.mBitsPerChannel    = 8 * sizeof(float);
    audioDescription.mSampleRate        = 44100.0;
    return audioDescription;
}

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

signed char *audioPtr = (signed char*)audio->mBuffers[0].mData;

Я отправляю этот указатель на мой класс кодировщика и перебираю данные следующим образом: (Предположим, "байты" равны 1024, а readbuffer[] получает блок по 1024 байта за раз от *audioPtr.) Это стандартная обработка массива от Vorbis. Пример кодера.

for (i=0 ;i<bytes/4; i++) 
{
   buffer[0][i]=((readbuffer[i*4+1]<<8) |
                        (0x00ff&(int)readbuffer[i*4]))/32768.f;
   buffer[1][i]=((readbuffer[i*4+3]<<8) |
                        (0x00ff&(int)readbuffer[i*4+2]))/32768.f;
}

Обычно двухканальный буфер имеет дело с чередованным звуком. Я знаю, что мой ASBD - это звук без чередования. Но я слышу правильное аудио, кодируемое libvorbis. Тем не менее, это имеет много искажений. Истинное аудио находится в последних 2 из 4 байтов в каждой итерации цикла. (ie: buffer[1][i]) Так что я могу сбросить первые 2 байта. Я не думаю, что это проблема с порядком байтов, так как звук искажен.

Я несколько раз пытался изменить ASBD (например, целые числа со знаком вместо числа с плавающей запятой) и изменить порядок байтов. Но аудио только кодирует с этим ASBD вместе с петлей выше, хотя с искажением. Я думаю, что просто не понимаю формат данных, поступающих с AudioBuffer, даже прочитав Core Audio и множество примеров. Опять же, я знаю, что моя реализация libvorbis работает с чтением wav-файлов. Но не с живым звуком через аудиоустройства.

Любая помощь будет оценена! Спасибо

0 ответов

Другие вопросы по тегам