AVFoundation连续系列之一音频录制

489 篇文章 14 订阅
464 篇文章 13 订阅

1、框架简介

AVFoundation是基于CoreAudio、CoreVideo、CoreMedia、CoreAnimation之上 处理基于时间的媒体数据的高层框架 ,在AVFoundation框架之上苹果还提供给咱们更高层一些 处理媒体数据的框架,如AVKit、iOS的UIKit、OS的AppKit。 AVFoundation提供了大量强大的工具集,可通过这个框架处理音视频编程。

可以实现的功能

1) 音频的录制、播放 2) 视频的播放 3) 媒体文件检查 4) 媒体捕捉 5) 媒体编辑 6) 媒体处理 7) 媒体采样 8) 媒体压缩 9) 音频编解码 10) 视频编解码

包含的主要类

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 音频的配置信息

2、音频的录制

2.1 简介

1) 录制 AVAudioRecorder 是基于Audio Queue Services

2) 可通过Mac机器或iOS设备上的内置麦克风录制音频,也可通过外部音频设备录制

3) 了解音频会话

<1> 所有的iOS应用程序 都有音频会话,不管是否是手动启用,它都默认的音频会话。 <2> 可以根据音频会话 来决定音频的状态,如做游戏的时候 音频是否可以与背景音混合、音频播放是核心功能还是 次要功能 <3> 下图是音频会话的分类功能查询表

分类说明是否要求混音是否要求音频输入是否要求音频输出是否受静音键影响
Ambient游戏
SoloAmbient游戏
Playback音视频播放器可选
Record录制
PlayAndRecordVOIP、语音聊天可选
AudioProcessing离线会话、处理
MultiRoute使用外部硬件的音视频程序

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

2.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对象

2.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 }

2.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()
  }
​
}

好啦,咱们的音频采集就搞定了,下一篇咱们去讲怎么去播放咱们录制好的音频

原文链接:【原创】AVFoundation连续系列之一音频录制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是 AVFoundationAVFoundation是苹果公司提供的一个多媒体处理框架,它能够处理音频、视频、文本和图像等媒体类型,还能够实现录制、编辑、播放等多种操作。 2. AVFoundation的优点是什么? AVFoundation有以下几个优点: - 它可以在多个平台上使用,包括iOS、macOS和tvOS等。 - 它提供了灵活的API,可以对多种媒体类型进行处理。 - 它支持硬件加速,能够提高处理速度和性能。 - 它支持多种格式的媒体文件,包括MP3、AAC、H.264和MPEG-4等。 3. 如何使用AVFoundation实现音频录制? 在使用AVFoundation实现音频录制时,需要执行以下步骤: - 创建一个AVAudioSession对象,用于管理音频会话。 - 创建一个AVAudioRecorder对象,用于录制音频。 - 配置录音参数,例如音频格式、采样率、通道数、音频质量等。 - 调用AVAudioRecorder的record方法开始录音。 - 调用AVAudioRecorder的stop方法停止录音。 4. AVFoundation中的AVPlayerLayer是什么? AVPlayerLayer是一个CALayer子类,用于在iOS和macOS应用程序中显示视频内容。它可以显示一个AVPlayer对象的输出,并且支持全屏播放、画中画、视频内容缩放等功能。 5. 如何使用AVFoundation实现视频播放? 在使用AVFoundation实现视频播放时,需要执行以下步骤: - 创建一个AVPlayer对象,用于播放视频。 - 创建一个AVPlayerLayer对象,用于显示视频内容。 - 将AVPlayerLayer对象添加到视图层次结构中。 - 创建一个AVPlayerItem对象,用于管理视频资源。 - 调用AVPlayer的replaceCurrentItemWithPlayerItem方法将AVPlayerItem与AVPlayer关联。 - 调用AVPlayer的play方法开始播放视频。 6. 如何在AVFoundation中实现视频编辑? 在AVFoundation中实现视频编辑通常需要使用AVAsset、AVAssetTrack、AVComposition、AVMutableComposition等类。以下是实现视频编辑的大致步骤: - 创建一个AVAsset对象,用于表示视频资源。 - 创建一个AVMutableComposition对象,用于管理视频资源。 - 使用AVAssetTrack获取视频的音频和视频轨道。 - 使用AVMutableCompositionTrack将音频和视频轨道添加到AVMutableComposition中。 - 使用AVAssetExportSession导出编辑后的视频。 7. AVFoundation中的AVCaptureSession是什么? AVCaptureSession是用于管理视频和音频输入的会话对象。它可以管理多个输入设备(例如摄像头、麦克风等)并且可以将它们合并到单个输出中。使用AVCaptureSession可以方便地实现视频录制、视频流传输、实时视频分析等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值