WebRTC源码分析之IOS Audio Unit

本文详细分析了WebRTC在iOS平台上如何使用Audio Unit进行音频处理,包括Audio Unit的基本概念、类型及其在WebRTC中的应用。重点介绍了Voice-Processing I/O unit,用于录音和播放,并探讨了AudioUnitSetProperty设置属性,特别是理解Element和Scope的重要性,以实现高效的声音采集和回放。
摘要由CSDN通过智能技术生成

本来没想要写这篇,毕竟不是什么关键技术,但是实在是因为苹果的文档和API实在太烂了,网上关于Audio Unit的文章也太少,写下来就算当个笔记。

WebRTC与声音设备有关的代码在modules/audio_device目录下面,包括各个平台的录音采集和播放声音的代码。
其中windows上的使用了Core Audio API。
Core Audio API 应该是Vista之后才支持的API,以前在winxp时代,我用的都是wave API和directsound。不过现在Core Audio API 看上去好像更强大,貌似支持回音消除等功能。

ios上的录音和播放也用到了比较底层的技术:Audio Unit。之前写过相关的代码用的是相对高层的Audio Queue。
Audio Unit没有使用过,网上文章少的可怜,而且都没有说的比较清楚,甚至官网的文档也是垃圾的一塌糊涂,看半天还不知道怎么回事,API文档更是让人崩溃,屁说明都没有,比起微软的MSDN文档来简直简陋的令人发指。 只能凭着以前directshow的功底和WebRTC的代码猜测一番。

Audio Unit 概念知识


Audio Unit 主要涉及到三个常用的概念知识:
(1)AUGraph:包含和管理Audio Unit 的组织者;
(2)AUNode /AudioComponent:是AUGraph音频处理环节中的一个节点。
(3)AudioUnit: 音频处理组件,是对音频处理节点的实例描述者和操控者。
我们不妨想像演唱会的舞台上,有录制歌声与乐器的麦克风,而从麦克风到输出到音响之间,还串接了大大小小的效果器,在这个过程中,无论是麦克风、音响或是效果器,都是不同的AUNode。AUNode 是这些器材的实体,而我们要操控这些器材、改变这些器材的效果属性,就会需要透过每个器材各自的操控界面,这些介面便是AudioUnit,最后构成整个舞台,便是AUGraph。AUNode 与AudioComponent 的差别在于,其实像上面讲到的各种器材,除了可以放在AUGraph 使用之外,也可以单独使用,比方说我们有台音响,我们除了把音响放在舞台上使用外,也可以单独拿这台音响输出音乐。当我们要在AUGraph 中使用某个器材,我们就要使用AUNode 这种形态,单独使用时,就使用AudioComponent。但无论是操作AUNode 或AudioComponent,都还是得透过AudioUnit 这一层操作界面。(上述文字摘自KKBOX iOS/Mac OS X 基础开发教材)

WebRTC只使用了AudioUnit组件。
这儿感觉AUGraph有点像dshow中的多个Filter在 Filter Graph自己组合配合工作。而AudioUnit就是包装好的单个Filter的 FilteGraph。

Audio Units


下面直接来看WebRTC中的代码:


bool VoiceProcessingAudioUnit::Init() {
  RTC_DCHECK_EQ(state_, kInitRequired);
  // Create an audio component description to identify the Voice Processing
  // I/O audio unit.
  AudioComponentDescription vpio_unit_description;
  vpio_unit_description.componentType = kAudioUnitType_Output;
  vpio_unit_description.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
  vpio_unit_description.componentManufacturer = kAudioUnitManufacturer_Apple;
  vpio_unit_description.componentFlags = 0;
  vpio_unit_description.componentFlagsMask = 0;
  // Obtain an audio unit instance given the description.
  AudioComponent found_vpio_unit_ref =
      AudioComponentFindNext(nullptr, &vpio_unit_description);

  // Create a Voice Processing IO audio unit.
  OSStatus result = noErr;
  result = AudioComponentInstanceNew(found_vpio_unit_ref, &vpio_unit_);
  if (result != noErr) {
    vpio_unit_ = nullptr;
    RTCLogError(@"AudioComponentInstanceNew failed. Error=%ld.", (long)result);
    return false;
  }
...
}

AudioComponentDescription的componentManufacturer永远为kAudioUnitManufacturer_Apple。componentFlags和componentFlagsMask也为0,不用问为什么,因为文档就这样写着。

componentType和componentSubType结合代表了Audo Unit中的七种类型:

Effect: iPod Equalizer
Mixing: 3D Mixer、Mutichannel Mixer
I/O:Remote I/O、Voice-Processing I/O、Generic Output
Format Conversion:Format Converter


Effect Unit
一个效果单元,iPod Equalizer,与 iPod 内置应用使用相同的均衡器。此 audio unit 提供了一组预设的均衡曲线,例如低音增强,Pop 和 Spoken Word。

Effect Unit: 
componentType = kAudioUnitType_Effect
componentSubType = kAudioUnitSubType_AUiPodEQ

Mixer Units
一共两个 mixer units:3D Mixer unit 和Multichannel Mixer unit。
3D Mixer unit 是 OpenAL 的基础,如果需要实现 3D Mixer unit 的特征,可以优先使用 OpenAL,它提供了高级 API,并且非常适合游戏应用程序。
Multichannel Mixer unit 为任意数量的单声道或立体声提供混音、立体声输出。可以打开和关闭每一个输入,设置输入增益。

Mixer Unit: 
1.
componentType = kAudioUnitType_Mixer
componentSubType = kAudioUnitSubType_AU3DMixerEmbedded
2.
componentType = kAudioUnitType_Mixe
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值