ios - ios中AudioUnitRender()函数返回的音频数据最大值是多少
问题描述
我在渲染回调函数中使用 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 范围的值。
AudioUnitRender() 作为麦克风音频数据返回的 Float32 类型数据的范围究竟是多少?
是否可以将 AudioUnitRender() 返回的任何原始音频作为整数获取?android 中的AudioRecord
类将原始麦克风音频作为带符号的短数字(16 位)提供给我。我正在寻找它在 ios 中的等价物,在目标 C 中。
--- 编辑 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) );
解决方案
对于你问题的第二部分,是的。您可以配置许多音频单元(例如 RemoteIO)以 16 位有符号整数格式输出音频样本。
将音频单元 kAudioUnitProperty_StreamFormat 属性设置为:
AudioStreamBasicDescription audioFormat;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger;
audioFormat.mBitsPerChannel = 16;
// etc.
这曾经是 iPhone 3G 时代的默认格式。但是较新的 iPhone 可以使用 32 位浮点数更快地执行音频 DSP,因此默认值已更改。
推荐阅读
- npm - 即使在 npm init 之后,npm 也会全局安装包
- python-3.x - numpy 数组列表而不是一个热向量
- html - css动画无法在导航栏中实现
- mysql - 初始化mysql centos 6时遇到问题
- react-native - jest / react-native:替换/禁用 Linking.catch
- php - 使用ajax插入查询不工作
- swift - mouseMoved 在 NSTrackingArea 之外触发
- java - Spring XsltViewResolver 前缀路径
- c++ - 互斥锁在生产者-消费者问题中阻塞线程
- facebook - 用于集中式社交登录的 2 跳“授权码”流 oauth2 身份验证