快手 · 移动端音视频开发实战
展晓凯
快手回森技术负责人
12246 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
快手 · 移动端音视频开发实战
15
15
1.0x
00:00/00:00
登录|注册

02|iOS平台音频渲染(二):使用 AudioUnit 渲染音频

你好,我是展晓凯。
上节课我们学习了 iOS 平台的音频框架的第一部分,深入了解了 AVAudioSession 以及 AudioQueue 的使用方法,同时也学习了 iOS 音频格式的表示方法,就是 ASBD。其中重点学习了 AudioQueue 渲染音频的方法。AudioQueue 这个 API 其实是介于 AVPlayer/AVAudioPlayer 与 Audio Unit 之间的一个音频渲染框架。如果我们想对音频有更高层次的控制,而 AudioQueue 满足不了我们的开发需求的时候,我们应该使用哪个音频框架呢?
图1 iOS平台的音频框架(图片来自苹果官网)
没错,就是 AudioUnit。作为 iOS 最底层的音频框架,AudioUnit 是音视频开发者必须要掌握的内容。我们在开发音频相关产品的时候,如果对音频有更高程度的控制、性能以及灵活性需求,或者想使用一些特殊功能(比如回声消除、实时耳返)的时候,就可以直接使用 AudioUnit 这一层的 API,这些接口是面向 C 语言的。
随着 iOS 的 API 不断升级,AudioUnit 还逐渐演变出了 AUGraph 与 AVAudioEngine 框架,它们可以为你的 App 融入更强大的音频多媒体能力。
正如苹果官方文档中描述的,AudioUnit 提供了快速的音频模块化处理功能,如果是在以下场景中,更适合使用 AudioUnit,而不是高层次的音频框架。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

iOS平台音频渲染(二):使用 AudioUnit 渲染音频 本文深入探讨了iOS平台的音频渲染框架中的AudioUnit,作为iOS最底层的音频框架,AudioUnit提供了更高层次的音频控制、性能和灵活性。文章从AudioUnit的分类、创建、参数设置和构建处理框架四个方面详细介绍了其使用方法。 在文章中,作者首先介绍了AudioUnit的五大类,包括Effect Unit、Mixer Units、I/O Units、Format Converter Units和Generator Units,并对每个大类型下的子类型及其用途进行了详细说明。其中,Effect Unit提供声音特效处理功能,Mixer Units用于混音多路声音,I/O Units提供I/O功能,Format Converter Units用于格式转换,Generator Units用于提供播放器功能。 此外,文章还强调了AudioUnit在特定场景下的适用性,如在VOIP应用场景下使用低延迟的音频I/O、合成多路声音并回放、使用特有功能如均衡器、压缩器、混响器等效果器以及需要图状结构处理音频时,可以使用iOS提供的AUGraph和AVAudioEngine的API接口。 总的来说,本文通过对AudioUnit的分类和用途进行详细介绍,为读者提供了深入了解iOS音频渲染框架的机会,使读者能够更好地掌握和应用AudioUnit的强大功能。 文章还介绍了创建和配置AudioUnit的方法,包括裸创建方式和AUGraph创建方式,以及对RemoteIO Unit的详细解释和使用方法。通过实际场景的示例,展示了如何以AUGraph的方式管理声音采集、处理和输出的整个过程,以及连接不同AUNode的方式。 总的来说,本文为读者提供了深入了解iOS音频渲染框架和AudioUnit的机会,使读者能够更好地掌握和应用其强大功能,同时也为后续的音频处理和播放项目打下了基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快手 · 移动端音视频开发实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 大土豆
    iOS Api就是花样多,这个Graph类似FFmpeg的滤镜graph,抽象了一部分的音频处理。Android Api就原始多了,解码出来的PCM,自己去处理吧,不提供任何Api,连重采样都没有。

    作者回复: iOS的多媒体能力还是非常强大的,不论底层的AUGraph还是AVFoundation框架,开发者在不同的场景可以选择适合自己当前阶段业务的框架去实现,非常方便,但是缺点就是不够通用,要想做跨平台的音频处理、视频处理模块,还是要掌握底层原理,使用通用的API或者开源库。

    2022-07-27归属地:北京
    2
    3
  • keepgoing
    老师这一讲的内容非常详细,对iOS audio unit的使用有了很详细的了解,其中还是有几个问题想确认希望老师有空时帮忙解答,十分感谢: 1. 示例代码中给audio unit扬声器播放的场景设置ASBD代码是: AudioUnitSetProperty( remoteIOUnit,kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &asbd, sizeof(asbd)); 这里的element 是1,请问是不是应该改成element为0;另外asbd需要给element的0的output和input scope都设置一下吗? 2. 老师在文中给出的将remote i/o audio unit element 0 与扬声器进行连接使用的key是 kAudioOutputUnitProperty_EnableIO,这个key的本质是一个开关,是不是可以理解remote i/o audio unit 的 element 0 output 和 element 1 input 本身已经与扬声器/麦克风连接了,我们使用时只需要将kAudioOutputUnitProperty_EnableIO的值设置为1,即启动了这个连接? 3. 在问题2的基础上,请问该如何将 element 0 的 input 和 element 1 的 output 连接起来。 如果想实现老师文中提到的从麦克风中采集音频后使用扬声器播放的场景,element 0 需要数据时可以通过预先设置的call back 方法感知到,需要调用什么接口才能从 element 1 中获取采集到的数据呢,这块没有特别想明白,想请老师提示下细节,感谢! 学了老师的课确实对 audio unit 有了更多好奇的地方,上面是一些困惑,希望老师有空时能帮忙解答,非常感谢!如果有一些理解错误或者鱼唇的地方,请老师多多包涵

    作者回复: 1 是1,原因是这里设置的是remoteIO这个Unit的Output(即扬声器,如果是Input则是麦克风)部分,对于Output部分的输出是不能设置的,只能设置Output的输入也就是inputElement也就是1; 2 kAudioOutputUnitProperty_EnableIO其实只有一个地方需要使用,就是启动麦克风的时候; 3 这个其实是耳返,可以通过设置callback或者Notify的形式实现 建议直接去github上看一下两个项目,直接运行起来debug一下就会理解的更透彻: https://github.com/zhanxiaokai/iOS-AudioPlayer https://github.com/zhanxiaokai/iOS-AudioRecorder

    2022-12-04归属地:北京
    2
    1
  • jcy
    问一下,如何需要提供很复杂、很强大的音频功能,使用 AUGraph 是否比使用 AVAudioEngine 有更大地灵活性

    作者回复: 是的,因为一些效果器在AUGraph层可以更加方便的使用,AVAudioEngine是更加面向对象的封装,提供的接口与API也更加友好一些。

    2022-08-08归属地:北京
    1
  • Ins
    老师能否补一下音频技术的历史发展,比如一些标准、频谱、编码之类的,讲一下音频的一些底层逻辑。

    作者回复: 后续有机会可以当作闲聊帖子来讲,可以看一下我的那本书(音视频开发进阶指南),书里面有更详细的分享。

    2022-09-26归属地:北京
  • jcy
    AURenderCallbackStruct renderProc; renderProc.inputProc = &inputAvailableCallback; renderProc.inputProcRefCon = (__bridge void *)self; AUGraphSetNodeInputCallback(mGraph, ioNode, 0, &finalRenderProc); 这里的 finalRenderProc 应该是 renderProc 吧

    作者回复: 是的,这里写错了,我修改一下,谢谢。

    2022-08-08归属地:北京
  • 好好浩浩
    有基于Android的吗?

    编辑回复: 下一讲就是哦~

    2022-07-28归属地:陕西
  • peter
    老师的课很好,很有价值;刚发现这个专栏,赶紧追赶,终于赶上了进度。 请教老师一个问题: 开篇词中老师提到“我所在的团队开发并维护了唱鸭、鲸鸣、虾米音乐等产品。当时我们将弹唱的实时耳返做到了业界最佳并独创了音乐弹幕的交互形式”, 请问:具有“音乐弹幕”功能的APP的完整名字叫什么? 我想下载一个。知道APP名字后我可以根据名字从应用市场上搜。
    2022-07-28归属地:陕西
    1
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部