Как я могу прочитать образцы из AudioBufferList? - PullRequest
5 голосов
/ 14 января 2012

Если я открываю аудиофайл с расширенными службами аудиофайлов, используя следующий формат данных клиента ...

AudioStreamBasicDescription audioFormat;
memset(&audioFormat, 0, sizeof(audioFormat));
audioFormat.mSampleRate = 44100.0;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsBigEndian | 
                           kAudioFormatFlagIsSignedInteger | 
                           kAudioFormatFlagIsPacked;
audioFormat.mBytesPerPacket = 4;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 2;
audioFormat.mBytesPerFrame = 4;
audioFormat.mBitsPerChannel = 16;

И настроить AudioBufferList следующим образом ....

AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0].mDataByteSize = bufferSize;
bufferList.mBuffers[0].mNumberChannels = audioFormat.mChannelsPerFrame;
bufferList.mBuffers[0].mData = buffer; //malloc(sizeof(UInt8) * 1024 * audioFormat.mBytesPerPacket)

Как же тогда данные располагаются в mData? Если я переберу данные вот так

for (int i = 0; i < frameCount; i++) {
        UInt8 somePieceOfAudioData = buffer[i];
}

тогда что такое SomePieceOfAudioData.

Это образец или кадр (левый и правый каналы вместе)? Если это образец, то для какого канала это образец? Если, например, это сэмпл с правого канала, будет ли буфер [i + 1] сэмплом для левого канала?

Есть идеи, ссылки? Спасибо!

Ответы [ 2 ]

9 голосов
/ 14 января 2012

Аудиоданные, как ожидается, будут чередоваться, если не установлено kAudioFormatFlagIsNonInterleaved. Я обнаружил, что для вопросов Core Audio лучшим источником документации обычно являются заголовки. CoreAudioTypes.h содержит следующий комментарий:

Как правило, когда используется ASBD, поля описывают полный макет данных образца в буферах, которые представлены этим описанием - где обычно эти буферы представлены AudioBuffer, который содержится в AudioBufferList.

Однако, когда ASBD имеет флаг kAudioFormatFlagIsNonInterleaved, AudioBufferList имеет другую структуру и семантику. В этом В этом случае поля ASBD будут описывать формат ОДНОГО из AudioBuffers, которые содержатся в списке, И каждый AudioBuffer в определяется, что список содержит один (моно) канал аудиоданных. Затем mChannelsPerFrame ASBD будет указывать общее количество AudioBuffers, которые содержатся в AudioBufferList - где каждый буфер содержит один канал. Это используется в основном с AudioUnit (и AudioConverter) представление этого списка - и не будет можно найти в использовании AudioHardware этой структуры.

В вашем конкретном случае буфер будет состоять из чередующихся шорт, начиная с левого канала.

1 голос
/ 15 января 2012

Да, вы читаете фрейм, и это два 16-битных сэмпла, левый и правый. (На самом деле, я не уверен, что слева, а что справа. Хммм.)

В дополнение к заголовочным файлам полезны ссылки на классы, встроенные в Xcode. Я обнаружил, что часто использую «option-click» и «command-click» в своем коде, когда разбираюсь в подобных деталях. (для новичков в Xcode ... эти клики дают вам информацию, документы и местоположение перехода к источнику соответственно.)

Предстоящая книга Кевина Авила и Криса Адамсона "Изучение базового звука: практическое руководство по программированию звука для Mac и iOS" прекрасно объясняет, как все это работает. Теперь он доступен в виде «черновой резки» в Safari Books Online:

http://my.safaribooksonline.com/book/audio/9780321636973

...