这个是AudioSession的结构图:
前一个部分已经介绍了AVFoundation对音频录制、播放的一种方法,下面再介绍另外一种:
AVCaptureSession
用这个类的优点在什么地方呢?
(1)可以方面的对输入源进行控制:方便录制音频视频,抓取图片。
(2)采集到数据源方便二次加工,比如音频变声、加背景音乐,视频添加滤镜特效。
(3)定制编解码方法,尽可能采用IOS支持的硬编硬解。比如7.0之前的AAC MPEG-4
当然8.0之后都支持H264的硬编解码。
所以如果想做一些复杂点的音视频APP,这个类是经常用到也是非常重要的。
先来看看AVCaptureSession的整体结构:
我们用这个结构可以做哪些事情呢?
(1)录制音频、视频、音频+视频
(2)录制过程中录制界面展示
(3)静态图片抓取
(4)中间层截获音视频数据流,实现音频特效,视频特效。
因为这里我们拿到的是数据流,所以要想进行本地存储还需要用到一个类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];
版权声明:本文为博主原创文章,未经博主允许不得转载。