Core Audio AudioBuffer mData - PullRequest
       18

Core Audio AudioBuffer mData

5 голосов
/ 04 сентября 2011

Я пытаюсь научиться манипулировать аудио на iOS и много читал на страницах разработчиков Apple. Тем не менее, я достиг точки, когда у меня есть AudioBuffer, и я не уверен, что с ним делать. Я знаю, что он содержит буфер mData, но я понятия не имею, что он содержит. Я посмотрел вокруг, что такое «буфер аудиоданных», как описывает его ссылка, но я все еще не понимаю, что это такое.

Кроме того, mData, похоже, относится к типу void, который, как я понимаю, может быть приведен как тип для конкретного содержащегося аудио. Я полагаю, я не уверен, как узнать, как это сделать.

Ответы [ 4 ]

3 голосов
/ 29 сентября 2011

Вам не нужно разыгрывать его.Это нормально как (void *).Он содержит образцы 8,24-битных целочисленных значений с фиксированной точкой.Я знаю, что это может быть пугающим на первый взгляд.Другие свойства AudioBuffer описывают, если есть более одного канала.Если это так, они чередуются.

Что вы можете с этим сделать, это написать функцию обратного вызова рендеринга, как описано в Руководство по хостингу аудиоустройства , и начать подачу кадров из буфера ввывод, следовательно, добиться воспроизведения звука.Преимущество состоит в том, что вы можете манипулировать данными буфера перед отправкой их на выход, таким образом достигая специальных эффектов, таких как изменение скорости воспроизведения, смещение высоты тона, задержка, эхо и т. Д.

Вывод в функцию рендерингав простом случае это что-то вроде этого:

 OSStatus renderInput(void *inRefCon,
    AudioUnitRenderActionFlags *ioActionFlags,
    const AudioTimeStamp *inTimeStamp,
    UInt32 inBusNumber,
    UInt32 inNumberFrames,
    AudioBufferList *ioData)
{
    float *outA = (float*)ioData->mBuffers[0].mData;
    float *outB = (float*)ioData->mBuffers[1].mData;

    for (int i=0; i<inNumberFrames; i++) {
       outA[i] = myBuffer.mData[i];
       outB[i] = myBuffer.mData[i];
    }
}

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

1 голос
/ 25 января 2013
OSStatus callback(void *inRefCon,AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames,
AudioBufferList *ioData);

ioData содержит данные, которые вам нужны.

Вы можете извлечь оттуда буферы, то есть:

AudioBuffer buffer = ioData->mBuffer[index];

В зависимости от количества каналов, это будет количество мегабайтов. Для моно:

AudioBuffer buffer = ioData->mBuffer[0];

Затем из буфера вы можете извлечь «настоящие» аудиоданные:

buffer.mData

И требуемый размер аудио:

buffer.mDataByteSize

Формат данных будет зависеть от вашей аудио конфигурации. Его можно кастовать, но он также будет работать как void, это будет зависеть от того, что вы хотите с ним делать.

1 голос
/ 22 ноября 2012

Если вы серьезно относитесь к изучению Core Audio, сделайте себе одолжение и получите эту книгу. Это заставило меня начать, и Core Audio непросто! http://www.amazon.com/Learning-Core-Audio-Hands-Programming/dp/0321636848

Pier.

0 голосов
/ 21 февраля 2013

это быстрый и простой пример приложения , использующего AudioBuffer на моем Github. Если вы немного поэкспериментируете с этим, вы получите представление о том, что делать с AudioBuffer .. (см. Также обсуждение ).

...