6

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

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

4

3 回答 3

5

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

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

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

于 2012-06-25T22:55:19.593 回答
1

根据频道的数量,我有两种不同的 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
于 2013-10-09T18:07:39.030 回答
0

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

audioFormat.mFormatFlags        = kAudioFormatFlagsCanonical;
于 2015-04-26T14:14:19.267 回答