zoukankan      html  css  js  c++  java
  • AudioQueue(AudioToolBox)的原理与使用

    前面和大家探讨了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);

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




  • 相关阅读:
    在Linux上安装 nessus
    漏洞靶场--webug4.0安装
    VMware问题--无法获得 VMCI 驱动程序的版本: 句柄无效
    RobotFramework 截取中文中的数字比较时长
    robotframework 找出重复元素
    Robot Framework 自动化接口测试
    xpath的编写规则
    python模块安装问题:no matching distribution found for XXX 或者 Read timed out.
    python字典获取最大值的键的值
    RobotFramework常见语法
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7110610.html
Copyright © 2011-2022 走看看