这个是AudioSession的结构图:
前一个部分已经介绍了AVFoundation对音频录制、播放的一种方法,下面再介绍另外一种:
AVCaptureSession
用这个类的优点在什么地方呢?
(1)可以方面的对输入源进行控制:方便录制音频视频,抓取图片。
(2)采集到数据源方便二次加工,比如音频变声、加背景音乐,视频添加滤镜特效。
(3)定制编解码方法,尽可能采用IOS支持的硬编硬解。比如7.0之前的AAC MPEG-4
当然8.0之后都支持H264的硬编解码。
所以如果想做一些复杂点的音视频APP,这个类是经常用到也是非常重要的。
先来看看AVCaptureSession的整体结构:
因为这里我们拿到的是数据流,所以要想进行本地存储还需要用到一个类AVAsset。
看看我们到底怎么用这个东东:
下面这个图描述了AVCaptureSession使用的基本流程
(1) 实例化AVCaptureSession(橙色部分)将输入输出源绑定到AVCaptureSession上。
输入源设置为mic:
AVCaptureDevice *mic = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput *audioinput = [AVCaptureDeviceInput deviceInputWithDevice:mic error:nil];
输出源设置为AVCaptureAudioDataOutput:
(2) 实例化紫色部分
紫色部拿到录音数据如何写到本地呢?这个时候就需要实例化AVAsset:
_AudioWriteInput = [[AVAssetWriterInput alloc]initWithMediaType:AVMediaTypeAudio outputSettings:setting];
参数设置:
NSDictionary *setting = [NSDictionary dictionaryWithObjectsAndKeys:
[ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
[ NSNumber numberWithInt: _AudioChannels], AVNumberOfChannelsKey,
[ NSNumber numberWithFloat: _Audiosamplerate], AVSampleRateKey,
[ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey,
_AudioChannelLayoutData, AVChannelLayoutKey,
nil];
音频相关参数设置参考另一篇博客:
(3) 启动整个音频管道,开始进行录音
(4) 音频回调方法会接收到录制的音频数据,将数据传递给AVAsset,写入到本地文件中。
写入音频数据:
[_AudioWriteInput appendSampleBuffer:sampleBuffer];
写入音频时间戳:
[_AudioWriter startSessionAtSourceTime:startTime];