AudioSession/AudioCaptureSession的分析与使用

这个是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];

音频相关參数设置參考还有一篇博客:

音频格式具体解释:WAV

(3)  启动整个音频管道,開始进行录音

(4)  音频回调方法会接收到录制的音频数据。将数据传递给AVAsset,写入到本地文件里。

写入音频数据:

[_AudioWriteInput appendSampleBuffer:sampleBuffer];

写入音频时间戳:

[_AudioWriter startSessionAtSourceTime:startTime];

 










posted @ 2017-04-29 14:55  brucemengbm  阅读(354)  评论(0编辑  收藏  举报