Каково максимальное значение аудиоданных, возвращаемых функцией AudioUnitRender () в ios - PullRequest
0 голосов
/ 30 ноября 2018

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

err = AudioUnitRender(player->outputUnit, ioActioanFlags, inTimeStamp, 1, inNumberFrames, ioData);  

Аудиоданные поступают в ioData при вызове функции обратного вызоваавтоматически.Я использую аудиоданные, возвращенные в ioData, как показано ниже:

for(frame = 0; frame<inNumberFrames; ++frame){  
    Float32 *data = (Float32*)ioData->mBuffers[0].mData;  
    myvar[k++] = (data)[frame];  
.  
.  
.  
}  

Здесь myvar - это массив типа Float32.Я догадался, что входной звук находится в диапазоне + 1,0 / -1,0, так как значения в myvar [] всегда были в этом диапазоне.Недавно я обнаружил, что если я издаю громкие звуки рядом с микрофоном, иногда я получаю значения в myvar [], которые находятся за пределами диапазона + 1,0 / -1,0.

Каков точный диапазон данных типа Float32, возвращаемых AudioUnitRender () в качестве аудиоданных микрофона?

Можно ли получить любое необработанное аудио, возвращаемое AudioUnitRender () в виде целого числа?Класс AudioRecord в Android дает мне необработанный звук с микрофона в виде коротких чисел со знаком (16 бит).Я ищу его эквивалент в ios, в цели C.

--- EDIT 1 ---

Текущая конфигурация, используемая для аудио, приведена ниже:

// Configure the audio session
AVAudioSession *sessionInstance = [AVAudioSession sharedInstance];

// we are going to play and record so we pick that category
NSError *error = nil;
[sessionInstance setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

// set the buffer duration to 5 ms
NSTimeInterval bufferDuration = .004;        // with setPreferredSampleRate:16000 gives inNumberFrames =  64 in SineWaveRenderProc()
//    NSTimeInterval bufferDuration = .016;        // with setPreferredSampleRate:16000 gives inNumberFrames =  256 in SineWaveRenderProc() ;; NOTE: 0.004*4 = 0.016
[sessionInstance setPreferredIOBufferDuration:bufferDuration error:&error];

// set the session's sample rate
// [sessionInstance setPreferredSampleRate:44100 error:&error];     // ORIGINAL     // inNumberFrames =  256 in SineWaveRenderProc() with bufferDuration = .005; above
[sessionInstance setPreferredSampleRate:16000 error:&error];         // inNumberFrames =  64 in SineWaveRenderProc() with bufferDuration = .005; above


// activate the audio session
[[AVAudioSession sharedInstance] setActive:YES error:&error];
// XThrowIfError((OSStatus)error.code, "couldn't set session active");

// NOTE: looks like this is necessary
UInt32 one = 1;
AudioUnitSetProperty(player->outputUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &one, sizeof(one) );
AudioUnitSetProperty(player->outputUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &one, sizeof(one) );

1 Ответ

0 голосов
/ 01 декабря 2018

На 2 часть вашего вопроса, да.Вы можете настроить множество аудиоустройств (например, RemoteIO) для вывода аудиосэмплов в 16-разрядном целочисленном формате со знаком.

установить для свойства kAudioUnitProperty_StreamFormat аудиоустройства что-то вроде:

AudioStreamBasicDescription   audioFormat;
audioFormat.mFormatID         =  kAudioFormatLinearPCM;
audioFormat.mFormatFlags      =  kAudioFormatFlagIsSignedInteger;
audioFormat.mBitsPerChannel   =  16;
// etc.

Используетсячтобы быть форматом по умолчанию, еще в дни iPhone 3Gs.Но новые айфоны могут быстрее обрабатывать аудио DSP с помощью 32-разрядных операций с плавающей запятой, поэтому значение по умолчанию изменилось.

...