2

我正在用音频单元编写一个简单的 iOS 应用程序。我想添加混响效果。所以图表看起来像 RemoteIO_Input -> Reverb -> RemoveIO_Output。但是在尝试为混响单元设置流格式时出现错误 - kAudioUnitErr_FormatNotSupported. 该代码在不使用混响单元(图中的单个远程 IO)的情况下工作正常,因此其他配置似乎很好,我没有提供他们的代码。

UPD:使用 iOS 6

所以问题:

  1. 允许的格式有限制吗?

  2. 我应该使用什么格式参数?

  3. 应该在 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;

图表设置

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];
    }
4

1 回答 1

5

允许的格式有限制吗?

是的,而且他们通常非常严格。

我应该使用什么格式参数?

使用单位的默认 ASBD 或使用基于预先构建的标志集 (kAudioFormatFlagsAudioUnitCanonicalkAudioFormatFlagsCanonical) 的 ASBD,您将获得最大的运气。就像这样,而不是像这样编写自己的格式:

audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;

你会这样做:

audioFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;

一般来说,如果您只是将两个单元相互连接起来,他们将能够自己解决。kAudioFormatFlagsAudioUnitCanonical如果您需要提供自己的音频,则必须指定输入格式(并且它可能需要基于SInt32容器)。

如果您需要更大的灵活性,您可以AUConverter在混响单元之前放置一个音频单元,因为AUConverter它将能够处理更多的输入格式(例如正确的浮点样本)。请注意,这伴随着增加处理的警告,因为 AUConverter 必须实时转换音频格式。

您可以在Core Audio Essentials页面的Canonical Audio Data Formats标题下查看完整的 ASBD 示例。

应该在 RemoteIO 输出元素的任何范围内设置格式吗?

如果您的混响单元直接连接到 RemoteIO 输出,则这些单元应该能够自行对其进行分类。

于 2012-12-05T15:59:06.370 回答