<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. 常用方法属性1) 初始化 public init(URL url: NSURL, settings: [String : AnyObject]) throws 2) 预录制 public func prepareToRecord() -> Bool 预录值会执行AudioQueue初始化的过程 在创建录制对象的时候还传入了文件存储的本地URL 会在这时候创建 把录制启动的时间延迟降低 3) 录制 public func record() -> Bool 4) 暂停 public func pause() 5) 停止 public func stop() 6) 删除正在录制的 public func deleteRecording() -> Bool 7) 获得录音的状态 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: [AVSampleRateKey:44100,AVEncoderAudioQualityKey:AVAudioQuality.High.rawValue])
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()
}
} 好啦,咱们的音频采集就搞定了,下一篇咱们去讲怎么去播放咱们录制好的音频
|