iOS音频单元混响流格式问题-10868 kAudioUnitErr_FormatNotSupported

时间:2012-12-03 16:03:33

标签: ios avfoundation core-audio audiounit

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

UPD:使用iOS 6

所以问题:

  1. 是否对允许的格式有限制?

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

  3. 是否应在RemoteIO输出元素的任何范围内设置格式?

  4. 感谢您的关注。

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

1 个答案:

答案 0 :(得分:3)

  

是否对允许的格式有限制?

是的,他们通常都很严格。

  

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

使用单位的默认ASBD,或使用基于预先构建的标志集(kAudioFormatFlagsAudioUnitCanonicalkAudioFormatFlagsCanonical)的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输出,则这些单元应该能够自行排序。