如何使用在Mac OS的核心音频API的“kAudioUnitSubType_VoiceProces

2019-06-24 22:13发布

我发现的一个例子简单的播放直通应用程序中使用内置麦克风/扬声器与MacOSX的kAudioUnitSubType_VoiceProcessingIO亚型(不kAudioUnitSubType_HALOutput)。 在核心音频API的评论说,kAudioUnitSubType_VoiceProcessingIO可在桌面上,并与iPhone 3.0或更高版本,所以我认为必须有一个例子某处为MacOS。

你有什么想法,其中样品是什么? 或是否有任何人谁知道如何使用在MacOS上的kAudioUnitSubType_VoiceProcessingIO亚型? 我已经尝试过,我在iOS中一样的工作方式,但没有奏效。

Answer 1:

我发现了几件事情让这个IO单元。

  1. 流格式是真的挑剔。 它一定要是
    • LinearPCM
    • FlagsCononical
    • 每信道32位
    • (我做了1个频道,但它可能更多的工作) -
    • 采样率44100(可能与其他人的工作可能不是)
  2. 你不把它设置EnableIO。 IO是默认启用的,并且属性是不可写。
  3. 初始化之前设置流格式。

与其他核心音频的工作,你只需要检查每一个函数调用的错误状态,判断错误是什么,在每一步变化不大,直到你终于得到它的工作。



Answer 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


Answer 3:

由于SO张贴在这里 ,我意识到我应该使用此标志:

audioFormat.mFormatFlags        = kAudioFormatFlagsCanonical;


文章来源: How to use “kAudioUnitSubType_VoiceProcessingIO” subtype of core audio API in mac os?