AudioSession/AudioCaptureSession的分析与使用
这个是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];