Ios 如何使用AudioUnitEffect进行AudioUnitRender?
我正在尝试在audioUnit混音器的回调中使用audioUnit效果进行AudioUnitRender,但没有成功 我的混音器进入RemoteIO单元并在其回调中处理音频数据(来自文件)。很好用 然后,我将AudioUnit效果节点(混响)添加到图形中,并将其链接到AudioUnit。“我的效果”节点未连接到图形中的任何对象Ios 如何使用AudioUnitEffect进行AudioUnitRender?,ios,core-audio,Ios,Core Audio,我正在尝试在audioUnit混音器的回调中使用audioUnit效果进行AudioUnitRender,但没有成功 我的混音器进入RemoteIO单元并在其回调中处理音频数据(来自文件)。很好用 然后,我将AudioUnit效果节点(混响)添加到图形中,并将其链接到AudioUnit。“我的效果”节点未连接到图形中的任何对象 AudioComponentDescription auEffectDescription; auEffectDescription.componentType
AudioComponentDescription auEffectDescription;
auEffectDescription.componentType = kAudioUnitType_Effect;
auEffectDescription.componentSubType = kAudioUnitSubType_Reverb2;
auEffectDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
auEffectDescription.componentFlags = 0;
auEffectDescription.componentFlagsMask = 0;
我知道AudioGraph(zerokidz.com/AudioGraph)示例中描述的StreamFormat问题,并已按照AudioGraph中的说明设置了效果单元的StreamFormat
因此,我知道存在streamformat兼容性问题(请参阅)。我的ASBD:
[AudioUnitEffect]------------------------------
[AudioUnitEffect] Sample Rate: 44100
[AudioUnitEffect] Format ID: lpcm
[AudioUnitEffect] Format Flags: 41
[AudioUnitEffect] Bytes per Packet: 4
[AudioUnitEffect] Frames per Packet: 1
[AudioUnitEffect] Bytes per Frame: 4
[AudioUnitEffect] Channels per Frame: 2
[AudioUnitEffect] Bits per Channel: 32
[AudioUnitEffect]------------------------------
[AudioUnitMixer]------------------------------
[AudioUnitMixer] Sample Rate: 44100
[AudioUnitMixer] Format ID: lpcm
[AudioUnitMixer] Format Flags: 3116
[AudioUnitMixer] Bytes per Packet: 4
[AudioUnitMixer] Frames per Packet: 1
[AudioUnitMixer] Bytes per Frame: 4
[AudioUnitMixer] Channels per Frame: 2
[AudioUnitMixer] Bits per Channel: 32
[AudioUnitMixer]------------------------------
我已经了解(如果我错了,请纠正我)我的效果是在Float32中,而我的混音器使用AudioUnitSampleType(SInt32)。在调用AudioUnitRender之前和之后,我尝试了各种转换数据缓冲区的方法。我曾尝试将混音器的ASBD与AudioUnit效果相匹配,但我得到了一些可怕的失真(如果效果使用Float32类型(我想介于[-1,+1]之间),这是正常的)
苹果博士说:
*效果单位流格式注释
在输入范围上,按如下方式管理流格式:
-如果输入由音频单元连接馈送,则从该连接获取其流格式。
-如果输入由渲染回调函数提供,请在总线上设置完整的应用程序流格式。使用与回调提供的数据相同的流格式。在输出范围上,设置与输入相同的完整流格式。
*
我觉得这没什么帮助
无论如何,一定有一种方法可以用特效单元制作音频渲染器。有人成功了吗?谢谢
安德烈
我的混音器回调:
static OSStatus mainMixerCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
SoundEngine* se = (SoundEngine*)inRefCon;
// init buffers with zeros
memset((Byte *)ioData->mBuffers[0].mData, 0, ioData->mBuffers[0].mDataByteSize);
memset((Byte *)ioData->mBuffers[1].mData, 0, ioData->mBuffers[1].mDataByteSize);
// Render the Audio Track (works fine)
AudioUnitRender((AudioUnit)se.auTrack,ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
// Effect (fails when there. Error:-50)
AudioUnitRender((AudioUnit)se.auEffect, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
return noErr;
}
到现在为止,您可能已经解决了您的问题,但只是为了记录:缓冲区需要有一个通道,因此您需要设置两个音频缓冲区,每个通道一个,而不是现在的两个通道一个。谢谢,我一定会检查这一点。