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);

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-28 18:29:56

AudioQueue(AudioToolBox)的原理与使用的相关文章

iOS音频播放之AudioQueue(一):播放本地音乐

AudioQueue简介 AudioStreamer说明 AudioQueue详解 AudioQueue工作原理 AudioQueue主要接口 AudioQueueNewOutput AudioQueueAllocateBuffer AudioQueueEnqueueBuffer AudioQueueStart Pause Stop Flush Reset Dispose AudioQueueFreeBuffer AudioQueueGetProperty AudioQueueSetProper

AudioToolbox--利用AudioQueue音频队列,通过缓存对声音进行采集与播放

都说iOS最恶心的部分是流媒体,其中恶心的恶心之处更在即时语音. 所以我们先不谈即时语音,研究一下,iOS中声音采集与播放的实现. 要在iOS设备上实现录音和播放功能,苹果提供了简单的做法,那就是利用AVAudioRecorder和AVAudioPlayer.度娘大多数 也是如此.但是这种方法有很大的局限性.单说说这种做法:录音,首先得设置录音文件路径,然后录音数据直接写入了文件.播放也是首先给出文件路径,等到音 频整个加载完成了,才能开始播放.这相当不灵活. 我的做法是利用音频队列AudioQ

AudioToolbox--AudioQueue实现流播放接口

AudioMedia_ios.h [cpp] view plaincopy // //  AudioMedia_ios.h //  mmsplayer // //  Created by Weiny on 12-4-4. //  Copyright (c) 2012年 Weiny Zhou. All rights reserved. // #ifndef mmsplayer_AudioMedia_ios_h #define mmsplayer_AudioMedia_ios_h #include 

iOS音频播放 (五):AudioQueue

码农人生 ChengYin's coding life 主页 Blog 分类 Categories 归档 Archives 关于 About Weibo GitHub RSS Where there is a will, there is a way. -- Thomas Edison Aug 2nd, 2014 Audio, iOS, iOS Audio iOS音频播放 (五):AudioQueue Audio Playback in iOS (Part 5) : AudioQueue 在第三

iOS音频播放 (五):AudioQueue 转

原文出处 : http://msching.github.io/blog/2014/08/02/audio-in-ios-5/ 前言 在第三篇和第四篇中介绍了如何用AudioStreamFile和AudioFile解析音频数据格式.分离音频帧.下一步终于可以使用分离出来的音频帧进行播放了,本片中将来讲一讲如何使用AudioQueue播放音频数据. AudioQueue介绍 AudioQueue是AudioToolBox.framework中的一员,在官方文档中Apple这样描述AudioQueu

【如何快速的开发一个完整的iOS直播app】(原理篇)

一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯等技术,每一个技术都够你学几年的. 直播易:已经有各个领域的大牛,封装好了许多牛逼的框架,我们只需要用别人写好的框架,就能快速的搭建一个直播app,也就是传说中的站在大牛肩膀上编程. 二.了解直播 热门直播产品 映客,斗鱼,熊猫,虎牙,花椒等等 直播效果图 直播效果.jpeg 1.一个完整直播ap

iOS中声音采集与播放的实现(使用AudioQueue)

都说iOS最恶心的部分是流媒体,其中恶心的恶心之处更在即时语音. 所以我们先不谈即时语音,研究一下,iOS中声音采集与播放的实现. 要在iOS设备上实现录音和播放功能,苹果提供了简单的做法,那就是利用AVAudioRecorder和AVAudioPlayer.度娘大多数也是如此.但是这种方法有很大的局限性.单说说这种做法:录音,首先得设置录音文件路径,然后录音数据直接写入了文件.播放也是首先给出文件路径,等到音频整个加载完成了,才能开始播放.这相当不灵活. 我的做法是利用音频队列AudioQue

如何快速的开发一个完整的iOS直播app(原理篇)

前言 大半年没写博客了,但我一直关注着互联网的动向,最近会研究很多东西,并分享,今年移动直播行业的兴起,诞生了一大批网红,甚至明星也开始直播了,因此不得不跟上时代的步伐,由于第一次接触的原因,因此花了很多时间了解直播,整理了直播的原理,当前只是原理篇,后续会持续发布实战篇,教你从零开始搭建一个完整的iOS直播app,希望能帮助到更多的人更快的了解直播. 一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频

基于Qt移动应用的消息推送服务原理与应用

说到移动应用,大家都觉得移动嘛,当然是Java和Object-c来做啦,什么推送啊,各种系统调用啊,其实不然?如果你了解Qt, 你就知道我说的不然,也有所道理. 说道几点 一.目前Android的移动的消息.通知推送 1)轮询(Pull)方式:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等.而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池. 2)SMS(Push)方式:在Android平