2012-06-03 4 views
1

В настоящее время я создаю приложение, которое читает аудио с микрофона моего iPhone, а затем обрабатывает и визуализирует. Конечно, сначала я начинаю с аудиоматериала, но у меня есть одна небольшая проблема.AudioQueue Recording Audio Sample

Я определяю свою частоту дискретизации 44100 Гц и определяю свой буфер для хранения 4096 выборок. Что есть. Однако, когда я печатаю эти данные, скопируйте их в MATLAB, чтобы проверить точность проверки, частота выборки, которую я должен использовать, - это половина моей iPhone определенной скорости или 22050 Гц, чтобы она была правильной.

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

- (void)setupAudioFormat { 
    memset(&dataFormat, 0, sizeof(dataFormat)); 
    dataFormat.mSampleRate = kSampleRate; 
    dataFormat.mFormatID = kAudioFormatLinearPCM; 
    dataFormat.mFramesPerPacket = 1; 
    dataFormat.mChannelsPerFrame = 1; 
    // dataFormat.mBytesPerFrame = 2; 
    // dataFormat.mBytesPerPacket = 2; 
    dataFormat.mBitsPerChannel = 16; 
    dataFormat.mReserved = 0; 

    dataFormat.mBytesPerPacket = dataFormat.mBytesPerFrame = (dataFormat.mBitsPerChannel/8) * dataFormat.mChannelsPerFrame; 
    dataFormat.mFormatFlags = 
    kLinearPCMFormatFlagIsSignedInteger | 
    kLinearPCMFormatFlagIsPacked; 
} 

Если то, что я описал, неясно, пожалуйста, дайте мне знать. Благодаря!

EDIT

Добавление кода, который я использовал для вывода на печать данных

float *audioFloat = (float *)malloc(numBytes * sizeof(float)); 
int *temp = (int*)inBuffer->mAudioData; 
int i; 
float power = pow(2, 31); 
for (i = 0;i<numBytes;i++) { 
    audioFloat[i] = temp[i]/power; 
    printf("%f ",audioFloat[i]); 
} 
+0

Как вы проходите через буфер и печатаете каждый образец? Отправьте этот код, чтобы узнать, есть ли проблема. – hotpaw2

+0

Я предполагаю, что вы получаете поток стерео данных, например. 16 бит от левого канала, затем 16 бит от правого канала. – Davyd

+0

Добавлен код печати. Дайте мне знать, если это очистит что-либо до – MZimmerman6

ответ

0

я нашел проблему с тем, что я делаю. Это была проблема c-указателей, и, поскольку я никогда не программировал на C раньше, я, конечно, ошибался.

Вы не можете напрямую преобразовать inBuffer-> mAudioData в массив int. Так что я просто сделал следующее

SInt16 *buffer = malloc(sizeof(SInt16)*kBufferByteSize); 
buffer = inBuffer->mAudioData; 

Это работает просто отлично, и теперь мои данные правильной длины, и данные представлены должным образом.

+0

не является ли вышеупомянутая утечка памяти? (malloc, но не бесплатно) – Iftah

+0

предполагается, что вы освободите необходимую память – MZimmerman6

0

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

- (недействительный) feedSamplesToEngine: (UInt32) audioDataBytesCapacity аудиоданный: (недействительный *) аудиоданный { INT sampleCount = audioDataBytesCapacity/SizeOf (SAMPLE_TYPE);

SAMPLE_TYPE *samples = (SAMPLE_TYPE*)audioData; 
//SAMPLE_TYPE *sample_le = (SAMPLE_TYPE *)malloc(sizeof(SAMPLE_TYPE)*sampleCount);//for swapping endians 

std::string shorts; 
double power = pow(2,10); 
for(int i = 0; i < sampleCount; i++) 
{ 
    SAMPLE_TYPE sample_le = (0xff00 & (samples[i] << 8)) | (0x00ff & (samples[i] >> 8)) ; //Endianess issue 
    char dataInterim[30]; 
    sprintf(dataInterim,"%f ", sample_le/power); // normalize it. 
    shorts.append(dataInterim); 
}