ITKeyword,专注技术干货聚合推荐

注册 | 登录

AudioQueue(AudioToolBox)的原理与使用

u014011807 分享于 2015-07-14

2019阿里云全部产品优惠券(新购或升级都可以使用,强烈推荐)
领取地址https://promotion.aliyun.com/ntms/yunparter/invite.html

前面和大家探讨了AVFoundation对音频进行录制播放的多种方式,尤其是前一节,比较底层的控制了音频的录制。下面我们再来看看音频的整体框架:


我们来介绍介绍中间层黄色部分:AudioToolBox

这个部分主要探讨用Audio Queue对音频进行播放,当然可以用来录制。(因为上一节将的录制,所以为了不重复及多样性,我们这节将播放)

先看看音频播放的原理:

录音过程和播放过程的原理类似,这里就以音频播放来分析下AudioQueue的原理。

首先看下Audio Queue左中右三个部分,左边是音频源,中间是我们创建的音频队列,最右边是音频硬件扬声器。

我们在AudioQueue中首先创建3个Buffer,启动AudioQueue,开始从本地读取音频文件,读取出来的数据在CallBack回调方法中进行处理,数据先放在buffer 1中。当buffer1 装填完毕之后,开始装填buffer 2,同时已满的buffer 1音频数据,装填到扬声器中开始播放。这时候buffer 1已空。这时吧这个空的buffer在排在3后面继续等待音频数据装填。

整个结构图如下:

下面我们吧绿色方框放大,看看绿色方框到底做了哪些事情:

(1)创建AVAssetReader建立音频源和TrackOutput的关系

(2)获取所要播放的音频参数,并设置音频输出格式

这时候我们已经拿到音频数据了,下面就来看看音频队列是如何工作的:

(1)首先创建一系列的线程队列,(这里可以参考这篇博客:)

(2)将音频回调方法,以及音频队列绑定在一起。

//          设施输出音频数据格式,设置回调函数。设置音频队列。

            AudioQueueNewOutput(&mdataFormat, BufferCallBack, (__bridge void *)(self), nil, nil, 0, &mqueue);

(3)开始给3个buffer装填数据,并设置一些音频参数

(4)启动音频队列

AudioQueueStart(mqueue, nil);

(5)每当一组音频数据读取完毕之后会自动触发回调方法,读取下一帧数据。

copyNextSampleBuffer

(6)同时如果我们想要对音频进行实时处理的话,比如加特效,绘制实时波形,可以在读取下一帧音频数据的回调方法中:

    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(

                                                           sampleBuffer,

                                                           NULL,

                                                           &audioBufferList,

                                                           sizeof(audioBufferList),

                                                            NULL,

                                                           NULL,

                                                           0,

                                                           &blockBuffer);

   

    //  获取实时音频数据的长度。

    pcmsize = audioBufferList.mBuffers[0].mDataByteSize;

    //  将音频数据从audioBufferList.mBuffers[0].mData装入pcmbuffer

    memcpy(pcmbuffer, (unsigned char *)(audioBufferList.mBuffers[0].mData), pcmsize);

 

拿到原始音频数据,进行处理。




前面和大家探讨了AVFoundation对音频进行录制播放的多种方式,尤其是前一节,比较底层的控制了音频的录制。下面我们再来看看音频的整体框架: 我们来介绍介绍中间层黄色部分:AudioToolBox 这个

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。