Max*_*hev 2 core-audio avfoundation audiounit ios
我正在用 Audio Units 编写一个简单的 iOS 应用程序。我想添加混响效果。所以图形看起来像 RemoteIO_Input -> Reverb -> RemoveIO_Output。但是在尝试为混响单元设置流格式时出现错误 - kAudioUnitErr_FormatNotSupported。该代码在不使用混响单元(图形中的单个远程 IO)的情况下工作正常,因此其他配置似乎很好,我没有提供他们的代码。
UPD:使用 iOS 6
所以问题:
允许的格式有限制吗?
我应该使用什么格式参数?
应该在 RemoteIO 输出元素的任何范围内设置格式吗?
谢谢关注。
代码: 说明:
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;
Run Code Online (Sandbox Code Playgroud)
图表设置
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);
Run Code Online (Sandbox Code Playgroud)
格式说明和设置
// 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];
}
Run Code Online (Sandbox Code Playgroud)
允许的格式有限制吗?
是的,而且他们通常很严格。
我应该使用什么格式参数?
使用单位的默认 ASBD 或使用基于预先构建的标志集 (kAudioFormatFlagsAudioUnitCanonical和kAudioFormatFlagsCanonical) 的ASBD,您将获得最大的运气。就像这样,而不是像这样组成自己的格式:
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
Run Code Online (Sandbox Code Playgroud)
你会这样做:
audioFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
Run Code Online (Sandbox Code Playgroud)
一般来说,如果你只是将两个单元相互连接起来,他们就可以自己解决。如果您需要提供自己的音频,则必须指定输入格式(并且可能需要基于 of kAudioFormatFlagsAudioUnitCanonical,它是非交错线性 PCM,每个样本都表示为固定的 8.24 数字)SInt32容器)。
如果您需要更大的灵活性,您可以AUConverter在混响单元之前添加一个音频单元,因为AUConverter它将能够处理更多的输入格式(例如适当的浮点样本)。请注意,这伴随着增加处理的警告,因为 AUConverter 必须实时转换音频格式。
您可以在Core Audio Essentials页面的Canonical Audio Data Formats标题下看到完整的 ASBD 示例。
应该在 RemoteIO 输出元素的任何范围内设置格式吗?
如果您的混响单元直接连接到 RemoteIO 输出,则这些单元应该能够自己进行分类。
| 归档时间: |
|
| 查看次数: |
2423 次 |
| 最近记录: |