专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

iOS实时音频采集与播放

  1、前言
  在iOS中有很多方法可以进行音视频采集。如AVCaptureDevice,AudioQueue以及AudioUnit。其中AudioUnit是最底层的接口,它的优点是功能强大,延迟低;而缺点是学习成本高,难度大。对于一般的iOS应用程序,AVCaptureDevice和AudioQueue完全够用了。但对于音视频直播,最好还是使用AudioUnit进行处理,这样可以达到最佳的效果,著名的WebRTC就使用的AudioUnit做的音频采集与播放。今天我们就重点介绍一下AudioUnit的基本知识和使用。
  下图是AudioUnit在iOS架构中所处的位置:
  2、基本概念
  在介绍AudioUnit如何使用之前,先要介绍一下AudioUnit的基本概念,这样更有利于我们理解对它的使用。AudioUnit的种类AudioUnits共可分为四大类,並可细分为七种,可参考下表:AudoUnit的内部结构参考下图,AudioUnit内部结构分为两大部分,Scope与Element。其中scope又分三种,分別是inputscope,outputscope,globalscope。而element则是inputscope或outputscope內的一部分。
  AudioUnit的输入与输出下图是一个IOtype的AudioUnit,其输入为麦克风,其输出为喇叭。这是一个最简单的AudioUnit使用范例。Theinputelementiselement1(mnemonicdevice:theletterIofthewordInputhasanappearancesimilartothenumber1)Theoutputelementiselement0(mnemonicdevice:theletterOofthewordOutputhasanappearancesimilartothenumber0)3、使用流程概要描述音频元件kAudioUnitTypeOutputkAudioUnitSubTypeRemoteIOkAudioUnitManufacturerApple使用AudioComponentFindNext(NULL,descriptionOfAudioComponent)获得AudioComponent。AudioComponent有点像生产AudioUnit的工厂。使用AudioComponentInstanceNew(ourComponent,audioUnit)获得AudioUnit实例。使用AudioUnitSetProperty函数为录制和回放开启IO。使用AudioStreamBasicDescription结构体描述音频格式,并使用AudioUnitSetProperty进行设置。使用AudioUnitSetProperty设置音频录制与放播的回调函数。分配缓冲区。初始化AudioUnit。启动AudioUnit。
  C音视频学习资料免费获取方法:关注音视频开发T哥,点击链接即可免费获取2023年最新C音视频开发进阶独家免费学习大礼包!4、初始化
  初始化看起来像下面这样。我们有一个AudioComponentInstance类型的成员变量,它用于存储AudioUnit。
  下面的音频格式用16位表式一个采样。definekOutputBus0definekInputBus1。。。OSStatusstatus;AudioComponentInstanceaudioUnit;描述音频元件AudioComponentDescriptiondesc;desc。componentTypekAudioUnitTypeOutput;desc。componentSubTypekAudioUnitSubTypeRemoteIO;desc。componentFlags0;desc。componentFlagsMask0;desc。componentManufacturerkAudioUnitManufacturerApple;获得一个元件AudioComponentinputComponentAudioComponentFindNext(NULL,desc);获得AudioUnitstatusAudioComponentInstanceNew(inputComponent,audioUnit);checkStatus(status);为录制打开IOUInt32flag1;statusAudioUnitSetProperty(audioUnit,kAudioOutputUnitPropertyEnableIO,kAudioUnitScopeInput,kInputBus,flag,sizeof(flag));checkStatus(status);为播放打开IOstatusAudioUnitSetProperty(audioUnit,kAudioOutputUnitPropertyEnableIO,kAudioUnitScopeOutput,kOutputBus,flag,sizeof(flag));checkStatus(status);描述格式audioFormat。mSampleRate44100。00;audioFormat。mFormatIDkAudioFormatLinearPCM;audioFormat。mFormatFlagskAudioFormatFlagIsSignedIntegerkAudioFormatFlagIsPacked;audioFormat。mFramesPerPacket1;audioFormat。mChannelsPerFrame1;audioFormat。mBitsPerChannel16;audioFormat。mBytesPerPacket2;audioFormat。mBytesPerFrame2;设置格式statusAudioUnitSetProperty(audioUnit,kAudioUnitPropertyStreamFormat,kAudioUnitScopeOutput,kInputBus,audioFormat,sizeof(audioFormat));checkStatus(status);statusAudioUnitSetProperty(audioUnit,kAudioUnitPropertyStreamFormat,kAudioUnitScopeInput,kOutputBus,audioFormat,sizeof(audioFormat));checkStatus(status);设置数据采集回调函数AURenderCallbackStructcallbackStruct;callbackStruct。inputProcrecordingCallback;callbackStruct。inputProcRefConself;statusAudioUnitSetProperty(audioUnit,kAudioOutputUnitPropertySetInputCallback,kAudioUnitScopeGlobal,kInputBus,callbackStruct,sizeof(callbackStruct));checkStatus(status);设置声音输出回调函数。当speaker需要数据时就会调用回调函数去获取数据。它是拉数据的概念。callbackStruct。inputProcplaybackCallback;callbackStruct。inputProcRefConself;statusAudioUnitSetProperty(audioUnit,kAudioUnitPropertySetRenderCallback,kAudioUnitScopeGlobal,kOutputBus,callbackStruct,sizeof(callbackStruct));checkStatus(status);关闭为录制分配的缓冲区(我们想使用我们自己分配的)flag0;statusAudioUnitSetProperty(audioUnit,kAudioUnitPropertyShouldAllocateBuffer,kAudioUnitScopeOutput,kInputBus,flag,sizeof(flag));初始化statusAudioUnitInitialize(audioUnit);checkStatus(status);
  开启AudioUnitOSStatusstatusAudioOutputUnitStart(audioUnit);checkStatus(status);
  关闭AudioUnitOSStatusstatusAudioOutputUnitStop(audioUnit);checkStatus(status);
  结束AudioUnitAudioComponentInstanceDispose(audioUnit);5、录制回调staticOSStatusrecordingCallback(voidinRefCon,AudioUnitRenderActionFlagsioActionFlags,constAudioTimeStampinTimeStamp,UInt32inBusNumber,UInt32inNumberFrames,AudioBufferListioData){TODO:使用inNumberFrames计算有多少数据是有效的在AudioBufferList里存放着更多的有效空间AudioBufferListbufferList;bufferList里存放着一堆buffers,buffers的长度是动态的。获得录制的采样数据OSStatusstatus;statusAudioUnitRender(〔audioInterfaceaudioUnit〕,ioActionFlags,inTimeStamp,inBusNumber,inNumberFrames,bufferList);checkStatus(status);现在,我们想要的采样数据已经在bufferList中的buffers中了。DoStuffWithTheRecordedAudio(bufferList);returnnoErr;}6、播放回调staticOSStatusplaybackCallback(voidinRefCon,AudioUnitRenderActionFlagsioActionFlags,constAudioTimeStampinTimeStamp,UInt32inBusNumber,UInt32inNumberFrames,AudioBufferListioData){Notes:ioData包括了一堆buffers尽可能多的向ioData中填充数据,记得设置每个buffer的大小要与buffer匹配好。returnnoErr;}7、结束
  AudioUnit可以做很多非常棒的的工作。如混音,音频特效,录制等等。它处于iOS开发架构的底层,特别合适于音视频直播这种场景中使用。
  我们今天介绍的只是AudioUnit众多功能中的一小点知识,但这一点点知识对于我来说已经够用了。对于那些想了解更多AudioUnit的人,只好自行去google了。
  知识无穷尽,只取我所需。这就是我的思想,哈!
  原文链接:iOS实时音频采集与播放

在自行车车轮上显示图像和动画,黑科技第四十一期头条创作挑战赛小伙伴们,今天给大家分享的这个黑科技,科技感满满啊。可以让你的自行车车轮播放图像和动画,这要是黑夜在大街上骑上几圈,你绝对是这条街最靓的仔。老规矩,详细鉴赏一下吧。声大豆价格2天之内落了7分,最低价格2。4元斤,11月24日大豆行情水分大与水分低的大豆价差已经拉开,高蛋白与低蛋白的大豆价差已经拉开,农民老铁们大家好,今天是11月24日,东北大豆市场出现了一个怪现象收黄豆的粮商不敢报价,报价怕挨骂,这个质朴的现1岁内的宝宝,经常抱着会有么什危害?2022育儿季响影骨骼发育新生儿骼骨发育不成熟,非常的柔弱,如果常经抱着的话,脊椎可能就会呈现曲弯的形状,时间久了可能就会对子孩的骨骼长生不利。相反,如果让宝宝平躺在床上的话,既可向绿而行冀北地区新能源交易突破100亿千瓦时日前,随着最后一单交易完成校核,近40家新能源发电企业与17家用户达成了购电交易,总量涉及3。07亿千瓦时。至此,冀北电力交易平台的新能源交易电量累计突破100亿千瓦时。冀北地区毗书籍分享第六天今天分享的是陈素娟整理好自己再去做父母有需要的可以看看,字迹潦草了些!多包涵!情绪管理生活中很多的父母只要面对孩子的问题都会控制不住自己的情绪,而情绪会影响孩子的身心的健康,用暴力多重利好刺激,A股或迎重要转折点?第二届ampampquot金长江ampampquot私募大赛10月名单出炉10月,市场大幅调整,各大指数相继创下阶段性新低。就行业来看,白酒电力煤炭以及银行等蓝筹股补跌,加剧了指数的下跌幅度,港股市场更是惨烈。10月的市场,对私募机构无疑是艰难的考验,无HTC王雪红我曾因傲慢倒下,如今想东山再起?难这个女人有很多身份。她是台湾塑料大王的女儿她是打败过富士康郭台铭的台湾首富。她被人称作女乔布斯巅峰时,她和她的HTC被苹果看作最大竞争对手。她就是王雪红,她曾是无人能望其项背的安卓重磅!中国足协官宣罚单助郑智一臂之力,广州队或中超保级有望最近中超比赛正在紧张进行中,各大球队为争夺成绩的排名,竞争已经进入到白热化的阶段。在这其中,作为曾经高高在上的八冠王广州队的情况无疑是非常尴尬的。从目前的积分排名来看,广州队处在倒动力电池中场绞杀,产能过剩即将到来?用疯狂来形容如今的动力电池行业,再合适不过。今年来,几乎每周都有动力电池工厂开工或行业投资的消息传出。刚刚过去的半个月里,力神电池在无锡锡山投资112亿元,建设动力电池基地蜂巢能源木门第一股被恒大拖入泥潭,巨额应收款项回收困难自2021年以来,房地产行业风险暴露加速,恒大等房企对上游供应商存在规模较大的应付敞口,不同程度上影响了产业链各上游企业的正常经营及盈利空间。01hr展望负面11月21日,中证鹏元减税降费利在固本培元近日,两组重要的财税数据在同一天相继发布。两组数据分别是财政收支减税降费,虽然相对独立,却显示出密切的内在关联性。规模空前的减税降费,既给财政增收带来不小压力,也为经济发展起到固本
正常听力不好配多少钱的助听器合适?助听器有很多种,价格从几百元到几万元的都有,那么为了排除这种烦恼,你最好去专业的正规的助听器验配店,她们会根据你家人的听力情况,以及你想要助听器解决哪些主要的问题来帮助你选择的,但美术老师工资多少合适?你好亲,很开心回答你的问题美术老师分为中小学美术老师,大学美术老师,高考美术专业老师,课外培训机构的美术老师如果是中小学美术老师,编制内都是固定的工资,基本工资,五险一金,年终奖等汽车倒车的时候,里程数是增大还是不变,还是减小?以前的机械式里程表有两种一种是所谓的死轴,前进正转,倒车反转(里程数减少)。(以前有些二手车贩子把软轴卡在手枪钻上修改里程)。另一种是活轴,计数器只能正转,倒车时计数器不转。而现在怀孕三个月过后就不用保胎了吗?首先,这里需要纠正的是三个月只是指在怀孕的十二周之后,胎儿的情况会慢慢稳定下来,根据实际情况,可以适当有性生活,而做其它的事情对胎儿的影响也相对较小。但小并不代表没有。因此,对于孕4k液晶电视机有推荐品牌吗?现在家庭日常选品的清晰度都要求越来越清晰,液晶屏的观看效果会更舒适,所以现在国民电视机选款都会从4K液晶电视入手。在目前的国民电视机品牌中,新产品层出不穷,不断更新迭代。其中TCL如何培养企业优秀的中层管理人才?一在培养之前首先要回答三个问题公司需要什么样的中层管理者?如何鉴定优秀?这一方面需要考虑到今天是否能够提供绩效,更重要的是要考虑到公司在未来的发展当中最需要什么样的人才,特别是在价中层干部很难再进入高层,不是经验和能力的问题,而是做人格局和做事立场,你怎么看?中层干部进入高层,经验和能力是敲门砖,没有经验和能力,做人的格局和做事的立场都是虚的。所以,想要进入高层,经验和能力是必备品,怎么会不是经验和能力的问题?只是,仅仅凭借经验和能力,特斯拉爆发大规模召回,问题频频依然销量猛涨,到底有何魔力?没有自己的电动新能源的核心技术,比如电池,电机和电控都生产不了,全是从其它工厂买来在东拼西凑的组装后销售,粗制滥造导致质量问题频发,特别是刹车失灵这种小问题都搞不好,靠的就是水军胡政信类信托产品有哪些?你好,产品很多,下面有列表您自行查看。项目地类型项目名称分档收益规模期限付息江苏镇江政信国企央企信托镇江丹徒1006。21。5亿12月年付湖南怀化政信国企央企信托湖南怀化集合资金信作为技术部门,我们比行政部门的地位还要低很多,这样的公司还要继续呆下去吗?客观的说,一直以来,大多数技术人才都屈居行政部门之下,因为行政部门靠文件和制度管理公司,偏向于务虚,且行政部门与技术部门没有太紧密的工作联系,所以行政部门相对来说是独立于技术之外的那些高中早恋的人后来怎么样了?恋爱是人生最美好的事之一。高中时期的恋爱更是美中之美。只是美到及至,必将走向反面。高中早恋结果多令人叹息。我身边就有许多这样的例子,我把他们的状况分成几类,与大家分享。第一类两情相
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网