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这个框架讲全,后面的内容会越来越有意思!

如果我哪有疏漏!请多多指出!谢谢!愿所有人每天都过的编程如此简单!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容