1.学iOS接到的第一个项目就是需要用到实时录音,所以也就接触到了Audio Queues,苹果的录音相对安卓的较麻烦些,有以下两种常见录音方式:
(1)苹果推荐我们使用AVFoundation框架中的AVAudioPlayer和AVAudioRecorder类。虽然用法比较简单,但是不支持流式;这就意味着:在播放音频前,必须等到整个音频加载完成后,才能开始播放音频;录音时,也必须等到录音结束后,才能获取到录音数据。这给应用造成了很大的局限性。
适用场合:不需要实时处理音频的时候,比如录备忘录等。
(2)在iOS和Mac OS X中,音频队列Audio Queues是一个用来录制和播放音频的软件对象,也就是说,可以用来录音和播放,录音能够获取实时的PCM原始音频数据。
使用场合:需要拿到实时的PCM录音数据或者需要利用实时的PCM的音频数据去播放。
2.这里不详细介绍音频队列Audio Queues的实现原理,主要讲代码,如果大家仍未熟悉Audio Queues,可以参考这位牛人的博客:http://blog.youkuaiyun.com/jiangyiaxiu/article/details/9190035
实现代码如下:(录音部分)
(1)首先,需要定义一些常数:
#define kNumberAudioQueueBuffers 3 //定义了三个缓冲区
#define kDefaultBufferDurationSeconds 0.1279 //调整这个值使得录音的缓冲区大小为2048bytes
#define kDefaultSampleRate 8000 //定义采样率为8000
(2)接着,需要初始化录音的参数,在初始化时调用:
[self setupAudioFormat:kAudioFormatLinearPCM SampleRate:(int)self.sampleRate];</span>
调用的setupAudioFormat函数如下:
// 设置录音格式
- (void)setupAudioFormat:(UInt32) inFormatID SampleRate:(int)sampeleRate
{
//重置下
memset(&_recordFormat, 0, sizeof(_recordFormat));
//设置采样率,这里先获取系统默认的测试下 //TODO:
//采样率的意思是每秒需要采集的帧数
_recordFormat.mSampleRate = sampeleRate;//[[AVAudioSession sharedInstance] sampleRate];
//设置通道数,这里先使用系统的测试下 //TODO:
_recordFormat.mChannelsPerFrame = 1;//(UInt32)[[AVAudioSession