irt*_*d88 5 iphone core-audio audiounit
我一直在为iOS的频率检测应用程序工作,我在用一个用户定义的AudioBufferList填充来自麦克风的音频样本时遇到问题.
当我在InputCallback方法中调用AudioUnitRender时,我得到的返回码为-50.我相信这意味着我的一个参数无效.我猜它是AudioBufferList,但我无法弄清楚它有什么问题.我想我已经设置好了它,它与我在ASBD中指定的数据格式相匹配.
下面是我认为可能不正确的远程I/O设置和函数调用:
ASBD:
size_t bytesPerSample = sizeof(AudioUnitSampleType);
AudioStreamBasicDescription localStreamFormat = {0};
localStreamFormat.mFormatID = kAudioFormatLinearPCM;
localStreamFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
localStreamFormat.mBytesPerPacket = bytesPerSample;
localStreamFormat.mBytesPerFrame = bytesPerSample;
localStreamFormat.mFramesPerPacket = 1;
localStreamFormat.mBitsPerChannel = 8 * bytesPerSample;
localStreamFormat.mChannelsPerFrame = 2;
localStreamFormat.mSampleRate = sampleRate;
Run Code Online (Sandbox Code Playgroud)
InputCallback声明:
err = AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_SetInputCallback,
kAudioUnitScope_Input,
kOutputBus, &callbackStruct, sizeof(callbackStruct));
Run Code Online (Sandbox Code Playgroud)
AudioBufferList声明:
// Allocate AudioBuffers
bufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer));
bufferList->mNumberBuffers = 1;
bufferList->mBuffers[0].mNumberChannels = 2;
bufferList->mBuffers[0].mDataByteSize = 1024;
bufferList->mBuffers[0].mData = calloc(256, sizeof(uint32_t));
Run Code Online (Sandbox Code Playgroud)
InputCallback函数:
AudioUnit rioUnit = THIS->ioUnit;
OSStatus renderErr;
UInt32 bus1 = 1;
renderErr = AudioUnitRender(rioUnit, ioActionFlags, inTimeStamp, bus1, inNumberFrames, THIS->bufferList);
Run Code Online (Sandbox Code Playgroud)
有几点需要注意:
再次感谢,你们都很棒!
德米特里
如果每帧有2个通道,则不能具有bytesPerSample帧的大小.由于术语有点令人困惑:
所以基本上,你需要使用bytesPerSample * mChannelsPerFrame的mBytesPerFrame,并使用mBytesPerFrame * mFramesPerPacket了mBytesPerPacket.
另外我注意到你使用32位作为样本大小.我不确定你是否真的想这样做 - 通常,你想用16位样本录制音频.对于大多数听众而言,16位和32位音频之间的声音差异几乎是不可能的(平均CD是以44.1kHz,16位PCM为主),它将为您节省50%的I/O和存储成本.
| 归档时间: |
|
| 查看次数: |
6196 次 |
| 最近记录: |