音视频系列之iOS: 音频采集 AudioUnit

AudioUnit是什么? 它是ios端进行音视频采集的框架,最全,最屌的!但是缺点就是学习成本大,但是大没关系,既然您已经看到这里,想必就是想搞音视频,这点小的困难应该能克服的。


我这边就先看怎么用,用完在讲讲具体的是什么东西比较好,这也是我一向学习新东西的习惯和方法,这个世界上的理论很多,真理也很多,我们可以选择接收和不接受,如果你看看下面的实现结果如果不满意就可以直接关闭,如果有兴趣可以欢迎一直看下去咯!

废话不多说了,我也没时间了,直接介绍:

操作流程:

no1: 描述音频元件: kAudioUnitType_Output。kAudioUnitSubType_RemoteIO/kAudioUnitManufacturerApple   这个知道就行,不需要了解

no2: 使用AudioComponentFindNext : 这个就当作是生产AudioUnit 的工厂

no3 : AudioComponentInstanceNew: 顾名思义,就是Audio Unit 的实例

no4:  AudioUnitSetProperty函数为录制和回放开启IO

no5: 使用 AudioStreamBasicDescription 结构体描述音频格式,并使用AudioUnitSetProperty进行设置

no6: 使用 AudioUnitSetProperty 设置音频录制与放播的回调函数

no7: 分配缓冲区

no8: 初始化Audio Unit

no9: 启动Audio  Unit


理论:

Core Audio

数字音频处理的基础设施,它是应用程序用来处理音频的一组软件框架,所有关于iOS音频开发的接口都是由Core Audio来提供或者经过它提供的接口来进行封装的。Apple官方对Core Audio的框架分层图示如下:



OutputOnlyWithRenderCallback_2x.png

较复杂的构建

输入端有两路音频流,都是通过rendercallback方式抓取数据,其中一路音频流直接给入到Mixer Unit中,另一路先经过EQ Unit处理后给入到Mixer Unit中,

OutputOnlyWithRenderCallbackExtended_2x.png

Tips

1. 多线程及内存管理

尽可能的避免render callback方法内做加锁及处理耗时较高的操作,这样可以最大限度的提升实时性能,如果播放数据或者采集数据存在不同线程读写的情况,必需要加锁保护,推荐pthread相关lock方法性能比其它锁要高

音频的输入输出一般都是一个持续的过程,在采集与播放的callback中,应尽量复用buffer及避免多次buffer拷贝,而不是每次回调都重新申请和释放,在适当的位置加上@autoreleasepool避免长时间运行内存不断上涨

2. 格式

Core Audio Type中定义了AudioStreamBasicDescription结构,Audio Unit及其它很多音频API对格式的配置都需要用到它,根据需要将该结构的信息填充正确,下面是44.1K,stereo,16bit的填充例子

audioDescription.mSampleRate = 44100;

audioDescription.mChannelsPerFrame = 2;

audioDescription.mBitsPerChannel = 16;

audioDescription.mFramesPerPacket = 1;

audioDescription.mFormatID = kAudioFormatLinearPCM;

audioDescription.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;

audioDescription.mBytesPerFrame = (audioDescription.mBitsPerChannel/8) * audioDescription.mChannelsPerFrame;

audioDescription.mBytesPerPacket = audioDescription.mBytesPerFrame ;

苹果官方建议在整个Audio Processing Graph或者Unit之间尽量以相同的音频格式流通,尽管Audio Unit的输入输出可以不同。另外在Unit之间输入输出连接点要保持一致。

3. 音质

在使用过程中,Audio Unit的format是可以动态改变的,但存在一种情况,Unit在销毁前最好恢复到默认创建时的format,否则在销毁后再重建Unit后,可能出现播放音质变差(音量变小,声音粗糙)的情况。

在使用VoiceProcessing I/O Unit过程,遇到在有些iphone上开启扬声器后,Unit从Mic采集过来的数据为空或者噪音的情况,从APP STORE中下载了其它的VOIP类型的APP也同样存在该问题,后来将AudioUnitSubType改成RemoteIO类型后,问题消失,怀疑苹果在VoiceProcessing Unit上对回声消除功能的处理上有bug

4. AudioSession

既然使用了音频特性,就会用到AudioSession,随着功能需求跟进,与它相关的问题也瞒多的,比如路由管理(听筒扬声器、线控耳机、蓝牙耳机),打断处理(interruption、iphone call)等,这里以Audio Unit为主,就不对它进行详细描述了,需要注意的是

音频的路由变更(用户挺拔耳机,或者代码调用强制切换)涉及到iOS硬件上输入和输出设备的改变,I/O类型Unit的采集和播放线程在切换过程中会阻塞一定时间(200ms左右),如果是语音对讲类对实时性要求较高的应用场景要考虑丢包策略。

在APP前台工作时,iPhone来电或者用户主动切换到其它音频类APP后,要及时处理音频的打断机制,在恰当的时机停止及恢复Unit的工作,由于iOS平台对资源的独占方式,iPhone在通话等操作时,APP中的Unit是无法初始化或者继续工作的。

作者:MasonFu

链接:http://www.jianshu.com/p/5d18180c69b8

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 本例需求:将Mic采集的PCM转成AAC,可得到两种不同数据,本例采用AudioQueue/AudioUnit两种...
    小东邪啊阅读 18,609评论 67 54
  • 斜眼旁观天下事, 横眉冷对千夫指。 我本热血少年郎, 天塌地陷又何妨! 龙夺海洋鹰霸天, 有我在时谁争先, 看我他...
    渭熙阅读 147评论 0 0
  • 姑姑和姑父都是年过七旬的人了,现在家里还养着三头牛,管着三个菜园子,还有十五亩农田!虽说春种秋收的时候表哥会回来...
    佑我天风阅读 341评论 1 1
  • 好久没有在秋天的晚上九点左右,骑着自行车吹着舒适的晚风,带着一天完成的工作目标惬意的骑车回去。要资源时被拒绝被接受...
    Fineyoga施佳阅读 630评论 0 1