【问题标题】:How to use "kAudioUnitSubType_VoiceProcessingIO" subtype of core audio API in mac os?如何在 mac os 中使用核心音频 API 的“kAudioUnitSubType_VoiceProcessingIO”子类型?
【发布时间】:2012-06-03 06:46:40
【问题描述】:

我正在寻找一个简单的 play-thru 应用程序示例,它在 macosx 中使用带有 kAudioUnitSubType_VoiceProcessingIO 子类型(不是 kAudioUnitSubType_HALOutput)的内置麦克风/扬声器。核心音频 api 上的 cmets 说 kAudioUnitSubType_VoiceProcessingIO 在桌面和 iPhone 3.0 或更高版本上可用,所以我认为macos 必须有一个例子。

您知道样品在哪里吗?或者有没有人知道如何在 macos 中使用 kAudioUnitSubType_VoiceProcessingIO 子类型?我已经尝试过与在 iOS 中相同的方法,但没有成功。

【问题讨论】:

    标签: macos core-audio


    【解决方案1】:

    我发现了一些启用这个 IO 单元的东西。

    1. 流格式真的很挑剔。它一定要是
      • 线性PCM
      • FlagsCononical
      • 每通道 32 位
      • (我做了 1 个频道,但它可能适用于更多频道)-
      • 采样率 44100(可能无法与其他人一起使用)
    2. 你没有在它上面设置 EnableIO。默认情况下启用 IO,并且该属性不可写。
    3. 在初始化之前设置流格式。

    与其他核心音频工作一样,您只需要检查每个函数调用的错误状态,确定错误是什么,并在每个步骤中进行少量更改,直到最终使其正常工作。

    【讨论】:

    • 谢谢,它也适用于其他采样率(我使用的是 16 000)。 FlagsCanonical 格式意味着在 MAC OS X Float32 中,范围从 -1.0 到 1.0。
    • @sarsonj:你确定你可以让它在默认的 44100 以外的采样率下工作吗?尝试设置 16000 或 48000 时,我得到 kAudioUnitErr_FormatNotSupported。
    • 我在 Mac 上使用一个通道,16000 和 kAudioFormatFlagsCanonical,它工作正常。
    • @sarsonj 您有在 OSX 上使用 audioUnit 播放音频的示例吗?我有同样的问题。我听从你的建议,但它不起作用。请帮帮我!
    • 可以确认它在 OS X 10.12 和 48000 上适用于我。但是,示例格式必须是 32 位浮点数,否则您最终会导致两端的音频损坏,并且输出中无法搜索到的错误。它也必须是单声道的。
    【解决方案2】:

    根据频道的数量,我设置了两种不同的 kAudioUnitProperty_StreamFormat。

    size_t bytesPerSample = sizeof (AudioUnitSampleType);
    stereoStreamFormat.mFormatID          = kAudioFormatLinearPCM;
    stereoStreamFormat.mFormatFlags       = kAudioFormatFlagsAudioUnitCanonical;
    stereoStreamFormat.mBytesPerPacket    = bytesPerSample;
    stereoStreamFormat.mFramesPerPacket   = 1;
    stereoStreamFormat.mBytesPerFrame     = bytesPerSample;
    stereoStreamFormat.mChannelsPerFrame  = 2;
    stereoStreamFormat.mBitsPerChannel    = 8 * bytesPerSample;
    stereoStreamFormat.mSampleRate        = graphSampleRate;
    

    size_t bytesPerSample = sizeof (AudioUnitSampleType);
    monoStreamFormat.mFormatID          = kAudioFormatLinearPCM;
    monoStreamFormat.mFormatFlags       = kAudioFormatFlagsAudioUnitCanonical;
    monoStreamFormat.mBytesPerPacket    = bytesPerSample;
    monoStreamFormat.mFramesPerPacket   = 1;
    monoStreamFormat.mBytesPerFrame     = bytesPerSample;
    monoStreamFormat.mChannelsPerFrame  = 1;                  // 1 indicates mono
    monoStreamFormat.mBitsPerChannel    = 8 * bytesPerSample;
    monoStreamFormat.mSampleRate        = graphSampleRate;
    

    将 I/O 单元用作 kAudioUnitSubType_VoiceProcessingIO 时使用此音频流格式

    AudioComponentDescription iOUnitDescription;
    iOUnitDescription.componentType = kAudioUnitType_Output;
    iOUnitDescription.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
    iOUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
    iOUnitDescription.componentFlags = 0;
    iOUnitDescription.componentFlagsMask = 0;
    

    我可以清楚地看到音频输出中断,因为缓冲区大小小于此 AudioUnit 的缓冲区大小。

    切换回 kAudioUnitSubType_RemoteIO

    iOUnitDescription.componentSubType = kAudioUnitSubType_RemoteIO;

    那个中断消失了。

    我正在处理来自麦克风的音频输入并对音频缓冲区应用一些实时计算。

    在方法中,graphSampleRate 是 AVSession 的采样率

    graphSampleRate = [AVAudioSession sharedInstance] sampleRate];
    

    也许我错了。

    最后配置参数值如下:

    立体声流格式:

    Sample Rate:              44100
    Format ID:                 lpcm
    Format Flags:              3116
    Bytes per Packet:             4
    Frames per Packet:            1
    Bytes per Frame:              4
    Channels per Frame:           2
    Bits per Channel:            32
    

    单声道流格式:

    Sample Rate:              44100
    Format ID:                 lpcm
    Format Flags:              3116
    Bytes per Packet:             4
    Frames per Packet:            1
    Bytes per Frame:              4
    Channels per Frame:           1
    Bits per Channel:            32
    

    【讨论】:

      【解决方案3】:

      感谢SO post here 我意识到我应该使用这个标志:

      audioFormat.mFormatFlags        = kAudioFormatFlagsCanonical;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-09
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 2011-03-13
        • 1970-01-01
        相关资源
        最近更新 更多