我正在使用Audio Units编写一个简单的iOS应用程序。我想添加一个混响效果。
所以图表看起来像RemoteIO_Input - >混响 - > RemoveIO_Output。
但是在尝试为混响单元设置流格式时遇到错误 - kAudioUnitErr_FormatNotSupported
。
没有使用混响单元(图中的单个远程IO),该代码工作正常,所以其他配置看起来很好,我不提供他们的代码。
UPD:使用iOS 6
所以问题:
是否对允许的格式有限制?
我应该使用什么格式的参数?
是否应在RemoteIO输出元素的任何范围内设置格式?
感谢您的关注。
CODE: 说明:
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
descRev.componentType = kAudioUnitType_Effect;
descRev.componentSubType = kAudioUnitSubType_Reverb2;
descRev.componentFlags = 0;
descRev.componentFlagsMask = 0;
descRev.componentManufacturer = kAudioUnitManufacturer_Apple;
图表设置
NewAUGraph(&graph);
AUNode ioNode;
AUNode rNode;
AUGraphAddNode(graph, &desc, &ioNode);
AUGraphAddNode(graph, &descRev, &rNode);
AUGraphOpen(graph);
AUGraphConnectNodeInput(graph, ioNode, 1, rNode, 0);
AUGraphConnectNodeInput(graph, rNode, 0, ioNode, 0);
格式说明和设置
// Describe format
audioFormat.mSampleRate = rate;//44100.00;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 2;
audioFormat.mBytesPerFrame = 2;
OSStatus err = AudioUnitSetProperty(unit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
kInputBus,
&audioFormat,
sizeof(audioFormat));
if (noErr != err) {
[self showStatus:err];
}
err = AudioUnitSetProperty(unitRev,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
0,
&audioFormat,
sizeof(audioFormat));
if (noErr != err) {
[self showStatus:err];
}
答案 0 :(得分:3)
是否对允许的格式有限制?
是的,他们通常都很严格。
我应该使用什么格式的参数?
使用单位的默认ASBD,或使用基于预先构建的标志集(kAudioFormatFlagsAudioUnitCanonical
和kAudioFormatFlagsCanonical
)的ASBD,您将获得最大的好运。就像在,而不是像这样编写自己的格式:
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
你会这样做:
audioFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
一般来说,如果你只是将两个单位相互连接起来,他们就可以自己整理出来。如果您需要提供自己的音频,则必须指定输入格式(并且它可能需要基于kAudioFormatFlagsAudioUnitCanonical
,这是非交错线性PCM,每个样本表示为修复了SInt32
容器中的8.24号码。
如果您需要更多灵活性,可以在混响单元之前粘贴AUConverter
音频单元,因为AUConverter
将能够处理更多输入格式(例如正确的浮点样本)。请注意,这需要增加处理的警告,因为AUConverter必须实时转换音频格式。
您可以在{em> Canonical Audio Data Formats 标题下的Core Audio Essentials页面上看到完整的ASBD示例。
应该在RemoteIO输出元素的任何范围内设置格式吗?
如果您的混响单元直接连接到RemoteIO输出,则这些单元应该能够自行排序。