iOS中AudioUnitRender()函数返回的音频数据的最大值是多少

时间:2018-11-30 09:57:55

标签: ios objective-c iphone core-audio

我正在使用渲染回调函数中的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];  
.  
.  
.  
}  

此处myvarFloat32类型的数组。我猜输入音频在+ 1.0 / -1.0范围内,因为myvar []中的值始终在该范围内。我最近发现,如果我在麦克风附近发出响亮的声音,有时myvar []中的值会超出+ 1.0 / -1.0范围。

由AudioUnitRender()返回的Float32类型数据作为麦克风音频数据的范围是什么?

是否有可能获得AudioUnitRender()返回的任何原始音频作为整数? android中的AudioRecord类为我提供了原始麦克风音频,为带符号的短数字(16位)。我正在寻找目标C中的ios等价物。

---编辑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 :(得分:2)

对于问题的第二部分,是的。您可以配置许多音频单元(例如RemoteIO)以16位带符号整数格式输出音频样本。

将“音频单元” kAudioUnitProperty_StreamFormat属性设置为类似以下内容:

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

在iPhone 3G时代,它曾经是默认格式。但是较新的iPhone可以使用32位浮点运算来更快地处理音频DSP,因此默认设置已更改。