AVFoundation连续系列之一音频录制
AVFoundation连续系列之一音频录制
一.框架简介
1.AVFoundation是基于CoreAudio、CoreVideo、CoreMedia、CoreAnimation之上处理基于时间的媒体数据的高层框架,在AVFoundation框架之上苹果还提供给咱们更高层一些处理媒体数据的框架,如AVKit、iOS的UIKit、OS的AppKit。AVFoundation提供了大量强大的工具集,可通过这个框架处理音视频编程。
2.可以实现的功能
1)音频的录制、播放
2)视频的播放
3)媒体文件检查
4)媒体捕捉
5)媒体编辑
6)媒体处理
7)媒体采样
8)媒体压缩
9)音频编解码
10)视频编解码
11)音频的音效处理
3.包含的主要类:
AVAnimation动画类
AVAsset:资产类可通过这个类获得图片、文件、媒体库
AssetDownloadTask资源下载任务
AVAssetExportSession资源导出会话:是一个通过资源文件对象去创建一个指定预设的输出的转码内容会话
AVAssetImageGenerator用于截取视频某帧的画面
AVAssetReader从资源读取音视频数据
AVAssetReaderOutput读取资源文件输出类
AVAssetResourceLoader资源文件的加载器会从AVURLAsset和代理方法得到加载的内容
AVAssetTrack资源的分轨
AVAssetTrackGroup这里面封装了一组资源的分轨
AVAssetTrackSegment表示资源分轨的一段
AVAssetWriter资源文件写入类
AVAssetWriterInput写入文件的输入类
AVAssetDownloadTask资源文件下载任务
AVCaptureDevice硬件捕获设备类
AVCaptureInput从硬件捕获设备获得输入的数据
AVCaptureOutput获得输出的数据
AVCaptureSession用于调配音视频输入与输出之间的数据流
AVCaptureVideoPreviewLayer捕获的视频数据的预览图层
AVMetadataObject音视频元数据是一个基类里面包含面部检测的元数据和二维码的元数据
AVPlayer音视频播放器
AVPlayerItem音视频播放的元素
AVPlayerItemMediaDataCollector音视频播放器元素媒体数据收集器
AVPlayerItemOutput播放器元素输出类
AVPlayerItemTrack播放器元素的分轨
AVPlayerLayer播放器的图层
AVPlayerMediaSelectionCriteria播放器媒体选择的规范
AVSampleBufferDisplayLayer用来显示压缩或解压的视频帧
AVSynchronizedLayer同步动画图层
AVTextStyleRule文本样式的规范
AVVideoCompositing视频合成的协议
AVAudioSettings音频的配置信息
AVAudioEngine 音频引擎
AVAudioNode音频节点
AVAudioTime音频时间类
AVMIDIPlayer MIDI播放器
AVAudioSession音频会话
二.音频的录制
1.简介
1)录制AVAudioRecorder是基于Audio Queue Services
2)可通过Mac机器或iOS设备上的内置麦克风录制音频,也可通过外部音频设备录制
3)了解音频会话
<1>所有的iOS应用程序都有音频会话,不管是否是手动启用,它都默认的音频会话。
<2>可以根据音频会话来决定音频的状态,如做游戏的时候音频是否可以与背景音混合、音频播放是核心功能还是次要功能
<3>下图是音频会话的分类功能查询表
2.准备:
创建录音对象需要为其提供一些信息
1)音频流写入到本地的本地文件URL,录制之后会把录制的音频文件存到这个本地URL内
2)录音的配置信息字典录音的配置信息的key可以在AVAudioSettings中查看
<1>AVFormatIDKey写入音频的格式他对应的值可以在CoreAudio/CoreAudioTypes.h中查看,一定要注意!录制的音频保存的时候要与选择的音频格式匹配
var kAudioFormatLinearPCM: AudioFormatID { get }
public var kAudioFormatAC3: AudioFormatID { get }
public var kAudioFormat60958AC3: AudioFormatID { get }
public var kAudioFormatAppleIMA4: AudioFormatID { get }
public var kAudioFormatMPEG4AAC: AudioFormatID { get }
public var kAudioFormatMPEG4CELP: AudioFormatID { get }
public var kAudioFormatMPEG4HVXC: AudioFormatID { get }
public var kAudioFormatMPEG4TwinVQ: AudioFormatID { get }
public var kAudioFormatMACE3: AudioFormatID { get }
public var kAudioFormatMACE6: AudioFormatID { get }
public var kAudioFormatULaw: AudioFormatID { get }
public var kAudioFormatALaw: AudioFormatID { get }
public var kAudioFormatQDesign: AudioFormatID { get }
public var kAudioFormatQDesign2: AudioFormatID { get }
public var kAudioFormatQUALCOMM: AudioFormatID { get }
public var kAudioFormatMPEGLayer1: AudioFormatID { get }
public var kAudioFormatMPEGLayer2: AudioFormatID { get }
public var kAudioFormatMPEGLayer3: AudioFormatID { get }
public var kAudioFormatTimeCode: AudioFormatID { get }
public var kAudioFormatMIDIStream: AudioFormatID { get }
public var kAudioFormatParameterValueStream: AudioFormatID { get }
public var kAudioFormatAppleLossless: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_HE: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_LD: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_ELD: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_ELD_SBR: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_ELD_V2: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_HE_V2: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_Spatial: AudioFormatID { get }
public var kAudioFormatAMR: AudioFormatID { get }
public var kAudioFormatAMR_WB: AudioFormatID { get }
public var kAudioFormatAudible: AudioFormatID { get }
public var kAudioFormatiLBC: AudioFormatID { get }
public var kAudioFormatDVIIntelIMA: AudioFormatID { get }
public var kAudioFormatMicrosoftGSM: AudioFormatID { get }
public var kAudioFormatAES3: AudioFormatID { get }
public var kAudioFormatEnhancedAC3: AudioFormatID { get }
<2> AVSampleRateKey采样率输入的模拟音频信号每一秒的采样数是影响音频质量和音频文件大小非常重要的一个因素采样率越小文件越小质量越低如44.1kHz
<3> AVNumberOfChannelsKey通道数1为单通道2为立体通道
<4> PCM专用
1. AVLinearPCMBitDepthKey采样位数又叫采样值或取样值用来衡量声音波动变化的参数,我们可以理解为声卡处理声音的解析度值越大解析度就越高录制和回放的声音就越真实采样位数的值8, 16, 24, 32这个Key是PCM专用的Key
2. AVLinearPCMIsBigEndianKey大端?小端?在内存中音频的存储模式。在计算机中通常采用的字节存储机制主要有两种:big-endian和little-endian,即大端模式和小端模式,可以理解为一段数据再内存中的起始位置以及终止位置他的值是波尔值这个key也是PCM专属
3. AVLinearPCMIsFloatKey采样信号是整数还是浮点数他的值是波尔值也是PCM专属
4. AVLinearPCMIsNonInterleaved是否允许音频交叉他的值是波尔值也是PCM专属
<5>编码部分
1. AVEncoderAudioQualityKey音质他的值是AVAudioQuality枚举
1)Min
2)Low
3)Medium
4)High
5)Max
2.AVEncoderAudioQualityForVBRKey动态比特率编码时候的音质值也是上面的枚举只和AVAudioBitRateStrategy_Variable有关系
3.AVEncoderBitRateKey编码时的比特率,是每秒传送的比特(bit)数单位为bps(Bit Per Second),比特率越高传送数据速度越快值是一个整数
4.AVEncoderBitRatePerChannelKey编码时每个通道的比特率
5.AVEncoderBitRateStrategyKey编码时比特率的策略下面是他的值
1)AVAudioBitRateStrategy_Constant常数
2)AVAudioBitRateStrategy_LongTermAverage平均数
3)AVAudioBitRateStrategy_VariableConstrained有限制的
4)AVAudioBitRateStrategy_Variable可变的
6.AVEncoderBitDepthHintKey编码时候的采样位数值从8-32
<6>采样率转换器的key
1.AVSampleRateConverterAlgorithmKey采样率转换器的算法值是下面
1)AVSampleRateConverterAlgorithm_Normal普通
2)AVSampleRateConverterAlgorithm_Mastering母带处理
2.AVSampleRateConverterAudioQualityKey采样率转换器的音质值是AVAudioQuality枚举
<7> AVChannelLayoutKey通道布局值是一个包含AudioChannelLayout的NSData对象
3.常用方法属性
初始化public init(URL url: NSURL, settings: [String : AnyObject]) throws
预录制public func prepareToRecord() -> Bool预录值会执行AudioQueue初始化的过程 在创建录制对象的时候还传入了文件存储的本地URL会在这时候创建 把录制启动的时间延迟降低
录制public func record() -> Bool
暂停public func pause()
停止public func stop()
删除正在录制的public func deleteRecording() -> Bool
获得录音的状态public var recording: Bool { get }
4.使用
创建音频会话
<1>分析:
我们可以根据实际需求去选择音频会话的分类,在这里,我们如果仅仅需要录音的话,我们可以选择Record,如果同时还想将来还可以播放,那我们就需要选择PlayAndRecord了。我们把创建音频会话的代码写在加载完所有选项开始启动app的时候didFinishLaunchingWithOptions,代码如下:
<2>代码
let audioSession = AVAudioSession.sharedInstance()
try!audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
try!audioSession.setActive(true)
2)创建录音对象
<1>设置录音完毕之后 保存录音的路径 这里我们为了不覆盖每一次录制完成的音频文件,我们采用时间戳作为音频文件的名字,这样就保障咱们的音频文件不会被覆盖了。代码如下
func saveAudioPath() ->String{
letpath:NSString = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask,true).first!asNSString
letaudioName =String(NSDate().timeIntervalSince1970).stringByAppendingString(".caf")
returnpath.stringByAppendingPathComponent(audioName)
}
<2>创建录音对象,注意我在前面把auidoRecorder声明成了属性
func preparerRecord(){
auidoRecorder =try! AVAudioRecorder.init(URL:NSURL.fileURLWithPath(saveAudioPath()),settings:[AVSampleRateKey:44100,AVEncoderAudioQualityKey:AVAudioQuality.High.rawValue])
auidoRecorder! .prepareToRecord()
}
<3>开始录音、停止录音控制
@IBActionfuncrecoderOrStop(sender: AnyObject){
letbutton:UIButton= senderas!UIButton
button.setTitle("停止录音", forState: .Selected)
if auidoRecorder ==nil{
preparerRecord()
}
if auidoRecorder!.recording {
button.selected =false
auidoRecorder!.stop()
auidoRecorder =nil
print(saveAudioPath())
}else{
button.selected =true
auidoRecorder!.record()
}
}
好啦,咱们的音频采集就搞定了,下一篇咱们去讲怎么去播放咱们录制好的音频
如果喜欢请关注!我会尽全力坚持把AVFoundation这个框架讲全,后面的内容会越来越有意思!
如果我哪有疏漏!请多多指出!谢谢!愿所有人每天都过的编程如此简单!