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)视频编解码
3.包含的主要类:
1)AVAnimation动画类
2)AVAsset:资产类可通过这个类获得图片、文件、媒体库
3)AssetDownloadTask资源下载任务
4)AVAssetExportSession资源导出会话:是一个通过资源文件对象去创建一个指定预设的输出的转码内容会话
5)AVAssetImageGenerator用于截取视频某帧的画面
6)AVAssetReader从资源读取音视频数据
7)AVAssetReaderOutput读取资源文件输出类
8)AVAssetResourceLoader资源文件的加载器会从AVURLAsset和代理方法得到加载的内容
9)AVAssetTrack资源的分轨
10)AVAssetTrackGroup这里面封装了一组资源的分轨
11)AVAssetTrackSegment表示资源分轨的一段
12)AVAssetWriter资源文件写入类
13)AVAssetWriterInput写入文件的输入类
14)AVAssetDownloadTask资源文件下载任务
15)AVCaptureDevice硬件捕获设备类
16)AVCaptureInput从硬件捕获设备获得输入的数据
17)AVCaptureOutput获得输出的数据
18)AVCaptureSession用于调配音视频输入与输出之间的数据流
19)AVCaptureVideoPreviewLayer捕获的视频数据的预览图层
20)AVMetadataObject音视频元数据是一个基类里面包含面部检测的元数据和二维码的元数据
21)AVPlayer音视频播放器
22)AVPlayerItem音视频播放的元素
23)AVPlayerItemMediaDataCollector音视频播放器元素媒体数据收集器
24)AVPlayerItemOutput播放器元素输出类
25)AVPlayerItemTrack播放器元素的分轨
26)AVPlayerLayer播放器的图层
27)AVPlayerMediaSelectionCriteria播放器媒体选择的规范
28)AVSampleBufferDisplayLayer用来显示压缩或解压的视频帧
29)AVSynchronizedLayer同步动画图层
30)AVTextStyleRule文本样式的规范
31)AVVideoCompositing视频合成的协议
32)AVAudioSettings音频的配置信息
二.音频的录制
1.简介
1)录制AVAudioRecorder是基于AudioQueueServices
2)可通过Mac机器或iOS设备上的内置麦克风录制音频,也可通过外部音频设备录制
3)了解音频会话
<1>所有的iOS应用程序都有音频会话,不管是否是手动启用,它都默认的音频会话。
<2>可以根据音频会话来决定音频的状态,如做游戏的时候音频是否可以与背景音混合、音频播放是核心功能还是次要功能 <3>下图是音频会话的分类功能查询表
分类说明是否要求混音是否要求音频输入是否要求音频输出是否受静音键影响
Ambient游戏是否是是
SoloAmbient游戏否否是是
Playback音视频播放器可选否是否
Record录制否是否否
PlayAndRecordVOIP、语音聊天可选是是否
AudioProcessing离线会话、处理否否否否
MultiRoute使用外部硬件的音视频程序否是是否
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> 采样率转换器的key1.AVSampleRateConverterAlgorithmKey 采样率转换器的算法 值是下面
1) AVSampleRateConverterAlgorithm_Normal 普通
2) AVSampleRateConverterAlgorithm_Mastering 母带处理
2.AVSampleRateConverterAudioQualityKey 采样率转换器的音质 值是AVAudioQuality枚举<7> AVChannelLayoutKey 通道布局 值是一个包含 AudioChannelLayout 的NSData对象 3. 常用方法属性1) 初始化 public init(URL url: NSURL, settings: ) throws2) 预录制 public func prepareToRecord() -> Bool 预录值会执行AudioQueue初始化的过程 在创建录制对象的时候还传入了文件存储的本地URL 会在这时候创建 把录制启动的时间延迟降低3) 录制 public func record() -> Bool4) 暂停 public func pause()5) 停止 public func stop()6) 删除正在录制的 public func deleteRecording() -> Bool7) 获得录音的状态 public var recording: Bool { get }4. 使用1) 创建音频会话<1>分析:
我们可以根据实际需求去选择音频会话的分类,在这里,我们如果仅仅需要录音的话,我们可以选择Record,如果同时还想将来还可以播放,那我们就需要选择PlayAndRecord了。我们把创建音频会话的代码写在加载完所有选项开始启动app的时候didFinishLaunchingWithOptions,代码如下:
<2>代码let audioSession = AVAudioSession.sharedInstance()
try!audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
try!audioSession.setActive(true)2)创建录音对象<1>设置录音完毕之后 保存录音的路径 这里我们为了不覆盖每一次录制完成的音频文件,我们采用时间戳作为音频文件的名字,这样就保障咱们的音频文件不会被覆盖了。代码如下func saveAudioPath() -> String {
let path:NSString = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! as NSString
let audioName = String(NSDate().timeIntervalSince1970).stringByAppendingString(".caf")
return path.stringByAppendingPathComponent(audioName)
}<2>创建录音对象,注意我在前面把auidoRecorder声明成了属性func preparerRecord(){
auidoRecorder = try! AVAudioRecorder.init(URL: NSURL.fileURLWithPath(saveAudioPath()), settings: )
auidoRecorder! .prepareToRecord()
}<3>开始录音、停止录音控制@IBAction func recoderOrStop(sender: AnyObject) {
let button:UIButton = sender as! 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()
}
}好啦,咱们的音频采集就搞定了,下一篇咱们去讲怎么去播放咱们录制好的音频
页:
[1]