Использование 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-файлов. Но не с живым звуком через аудиоустройства.
Любая помощь будет оценена! Спасибо