区块链技术博客
www.b2bchain.cn

播放和录制音频求职学习资料

本文介绍了播放和录制音频求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

音频会话

AVAudioSession(即音频会话)参与,音频会话是应用程序和操作系统交互的中介者,通过语义描述来调度系统音频功能。

音频会话分类

AVFoundation定义了7中分类来描述应用程序所使用的音频行为,如下表。

分类 作用 是否允许混音 音频输入 音频输出
Ambient 游戏、效率应用程序 允许 允许
Solo Ambient 游戏、效率应用程序 允许
Playback 音频和视频播放器 可选 允许
Record 录音机、音频捕捉 允许
Play And Record VoIP、语音聊天 可选 允许 允许
Audio Processing 离线会话和处理
Multi-Route 使用外部硬件的高级 A/V 应用程序 允许 允许

当为应用程序选择合适的分类时,你需要思考一些问题。不如音频播放是核心功能还是次要功能?应用程序的音频是否可以和背景声音相混合?应用程序是否需要捕捉音频输入进行录制或通过网络发送音频?确定了应用程序的核心音频后,选择合适的分类就变得比较容易了。

配置音频会话

AVAudioSession的配置在应用程序的生命周期内可以修改,但通常只会对其配置一次,一般在启动方法application(_:didFinishLaunchingWithOptions:)中进行配置,如下代码所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     AVAudioSession *session = [AVAudioSession sharedInstaance];     NSError *error;     if (![session setCategory:AVAudioSessionCategoryPlayback error:&error]) {         NSLog(@"Category Error:%@",[error localizedDescription]);     }     if (![session setActive:YES error:&error]) {         NSLog(@"ACtivation Error:%@",[error localizedDescription]);     }      return YES;  }
使用AVAudioPlayer播放音频

AVAudioPlayer是AV Foundation音频播放的首选,也可以说是整个iOS音频播放的首先,其提供了Audio Queue Service中所有核心功能,适合本地播放或对时延无敏感要求的场景。
AVAudioPlayer的创建有两类接口,一类是针对本地路径文件,如init(contentsOf: URL),另一类是针对内存Data,如init(data: Data),初始化参考代码如下所示:

NSURL *fileURL = ...; self.player = ... if (self.player) {     [self.player prepareToPlay]; }

在初始化的时候建议先调用prepareToPlay(),是因为会在调用play()方法之前获取需要的音频硬件并预加载AudioQueue缓冲区,可以降低调用play()方法和听到声音输出之间的时延。如果不调用prepareToPlay()方法,在调用play()方法时也会隐式调用类似于prepareToPlay()之类的方法来激活音频

AVAudioPlayer提供了一些列关于播放的生命周期控制方法,如下所示:

  • play():正式播放音频,可重新恢复被 pause 和 stop 停止的音频
  • pause():暂停音频播放,可从 play 重新恢复,但不清除掉prepareToPlay 的内容
  • stop():停止音频播放,清除掉 prepareToPlay 的内容,可从 play 重新恢复

AVAudioPlayer也提供了一部分音频控制的属性变量,如下所示:

  • volume:修改播放器的音量,范围从0.0~1.0,单位是浮点值
  • pan:播放器的声道,范围从-1(极左)到1.0(极右),默认值是0.0(居中)
  • rate:调整播放速率,从0.5~2.0
  • numberOfLoops: 循环播放次数,n > 0,实现 n 次播放,n = -1,表示无限循环
  • isMeteringEnabled: 是否启动音频计量,即输出音频的可视化计量数据
后台播放

在播放音频时,一个很常用的场景就是让App退出前台后,依然能在后台持续不断的播放音频直至用户停止。

想要在后台也能播放音频其实也不难,只需要两个步骤:

  1. 将音频会话的会话分类设置为Playback,该会话能让音频在手机静音情况下正常播放
  2. 需要在Info.plist文件中添加一个Required background modes类型数组,添加一个item项为App plays audio or streams audio/video using AirPlay

通过以上这两步,便可以让音频播放继续在后台服务。

中断处理

音频在播放时,有时候也会受到电话呼叫或Face Time呼叫,导致音频突然被中断,等到用户拒绝或者呼叫结束时,音频又开始从暂停位置重新播放。这一系列操作的成功实现,需要依赖AVAudioSession的中断通知,通过监听中断通知,当中断开始或中断结束,系统都会告诉外界发生的变化,示例代码如下所示:

func setupNotifications() {     let nc = NotificationCenter.default     nc.addObserver(self,                    selector: #selector(handleInterruption),                    name: AVAudioSession.interruptionNotification,                    object: AVAudioSession.sharedInstance) }  @objc func handleInterruption(notification: Notification) {  }
  • 中断通知会包含一个带有重要信息的userInfo,根据这个字典来决定音频的行为,暂停还是播放
  • handleInterruption(notification:):用来集中处理中断通知

handleInterruption(notification:)中处理中断通知的代码示例:

@objc func handleInterruption(notification: Notification) {     guard let userInfo = notification.userInfo,         let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,         let type = AVAudioSession.InterruptionType(rawValue: typeValue) else {             return     }      switch type {      case .began:      case .ended:          guard let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else { return }         let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)         if options.contains(.shouldResume) {          } else {          }      default: ()     } }

音频会话

AVAudioSession(即音频会话)参与,音频会话是应用程序和操作系统交互的中介者,通过语义描述来调度系统音频功能。

音频会话分类

AVFoundation定义了7中分类来描述应用程序所使用的音频行为,如下表。

分类 作用 是否允许混音 音频输入 音频输出
Ambient 游戏、效率应用程序 允许 允许
Solo Ambient 游戏、效率应用程序 允许
Playback 音频和视频播放器 可选 允许
Record 录音机、音频捕捉 允许
Play And Record VoIP、语音聊天 可选 允许 允许
Audio Processing 离线会话和处理
Multi-Route 使用外部硬件的高级 A/V 应用程序 允许 允许

当为应用程序选择合适的分类时,你需要思考一些问题。不如音频播放是核心功能还是次要功能?应用程序的音频是否可以和背景声音相混合?应用程序是否需要捕捉音频输入进行录制或通过网络发送音频?确定了应用程序的核心音频后,选择合适的分类就变得比较容易了。

配置音频会话

AVAudioSession的配置在应用程序的生命周期内可以修改,但通常只会对其配置一次,一般在启动方法application(_:didFinishLaunchingWithOptions:)中进行配置,如下代码所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     AVAudioSession *session = [AVAudioSession sharedInstaance];     NSError *error;     if (![session setCategory:AVAudioSessionCategoryPlayback error:&error]) {         NSLog(@"Category Error:%@",[error localizedDescription]);     }     if (![session setActive:YES error:&error]) {         NSLog(@"ACtivation Error:%@",[error localizedDescription]);     }      return YES;  }
使用AVAudioPlayer播放音频

AVAudioPlayer是AV Foundation音频播放的首选,也可以说是整个iOS音频播放的首先,其提供了Audio Queue Service中所有核心功能,适合本地播放或对时延无敏感要求的场景。
AVAudioPlayer的创建有两类接口,一类是针对本地路径文件,如init(contentsOf: URL),另一类是针对内存Data,如init(data: Data),初始化参考代码如下所示:

NSURL *fileURL = ...; self.player = ... if (self.player) {     [self.player prepareToPlay]; }

在初始化的时候建议先调用prepareToPlay(),是因为会在调用play()方法之前获取需要的音频硬件并预加载AudioQueue缓冲区,可以降低调用play()方法和听到声音输出之间的时延。如果不调用prepareToPlay()方法,在调用play()方法时也会隐式调用类似于prepareToPlay()之类的方法来激活音频

AVAudioPlayer提供了一些列关于播放的生命周期控制方法,如下所示:

  • play():正式播放音频,可重新恢复被 pause 和 stop 停止的音频
  • pause():暂停音频播放,可从 play 重新恢复,但不清除掉prepareToPlay 的内容
  • stop():停止音频播放,清除掉 prepareToPlay 的内容,可从 play 重新恢复

AVAudioPlayer也提供了一部分音频控制的属性变量,如下所示:

  • volume:修改播放器的音量,范围从0.0~1.0,单位是浮点值
  • pan:播放器的声道,范围从-1(极左)到1.0(极右),默认值是0.0(居中)
  • rate:调整播放速率,从0.5~2.0
  • numberOfLoops: 循环播放次数,n > 0,实现 n 次播放,n = -1,表示无限循环
  • isMeteringEnabled: 是否启动音频计量,即输出音频的可视化计量数据
后台播放

在播放音频时,一个很常用的场景就是让App退出前台后,依然能在后台持续不断的播放音频直至用户停止。

想要在后台也能播放音频其实也不难,只需要两个步骤:

  1. 将音频会话的会话分类设置为Playback,该会话能让音频在手机静音情况下正常播放
  2. 需要在Info.plist文件中添加一个Required background modes类型数组,添加一个item项为App plays audio or streams audio/video using AirPlay

通过以上这两步,便可以让音频播放继续在后台服务。

中断处理

音频在播放时,有时候也会受到电话呼叫或Face Time呼叫,导致音频突然被中断,等到用户拒绝或者呼叫结束时,音频又开始从暂停位置重新播放。这一系列操作的成功实现,需要依赖AVAudioSession的中断通知,通过监听中断通知,当中断开始或中断结束,系统都会告诉外界发生的变化,示例代码如下所示:

func setupNotifications() {     let nc = NotificationCenter.default     nc.addObserver(self,                    selector: #selector(handleInterruption),                    name: AVAudioSession.interruptionNotification,                    object: AVAudioSession.sharedInstance) }  @objc func handleInterruption(notification: Notification) {  }
  • 中断通知会包含一个带有重要信息的userInfo,根据这个字典来决定音频的行为,暂停还是播放
  • handleInterruption(notification:):用来集中处理中断通知

handleInterruption(notification:)中处理中断通知的代码示例:

@objc func handleInterruption(notification: Notification) {     guard let userInfo = notification.userInfo,         let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,         let type = AVAudioSession.InterruptionType(rawValue: typeValue) else {             return     }      switch type {      case .began:      case .ended:          guard let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else { return }         let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)         if options.contains(.shouldResume) {          } else {          }      default: ()     } }

音频会话

AVAudioSession(即音频会话)参与,音频会话是应用程序和操作系统交互的中介者,通过语义描述来调度系统音频功能。

音频会话分类

AVFoundation定义了7中分类来描述应用程序所使用的音频行为,如下表。

分类 作用 是否允许混音 音频输入 音频输出
Ambient 游戏、效率应用程序 允许 允许
Solo Ambient 游戏、效率应用程序 允许
Playback 音频和视频播放器 可选 允许
Record 录音机、音频捕捉 允许
Play And Record VoIP、语音聊天 可选 允许 允许
Audio Processing 离线会话和处理
Multi-Route 使用外部硬件的高级 A/V 应用程序 允许 允许

当为应用程序选择合适的分类时,你需要思考一些问题。不如音频播放是核心功能还是次要功能?应用程序的音频是否可以和背景声音相混合?应用程序是否需要捕捉音频输入进行录制或通过网络发送音频?确定了应用程序的核心音频后,选择合适的分类就变得比较容易了。

配置音频会话

AVAudioSession的配置在应用程序的生命周期内可以修改,但通常只会对其配置一次,一般在启动方法application(_:didFinishLaunchingWithOptions:)中进行配置,如下代码所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     AVAudioSession *session = [AVAudioSession sharedInstaance];     NSError *error;     if (![session setCategory:AVAudioSessionCategoryPlayback error:&error]) {         NSLog(@"Category Error:%@",[error localizedDescription]);     }     if (![session setActive:YES error:&error]) {         NSLog(@"ACtivation Error:%@",[error localizedDescription]);     }      return YES;  }
使用AVAudioPlayer播放音频

AVAudioPlayer是AV Foundation音频播放的首选,也可以说是整个iOS音频播放的首先,其提供了Audio Queue Service中所有核心功能,适合本地播放或对时延无敏感要求的场景。
AVAudioPlayer的创建有两类接口,一类是针对本地路径文件,如init(contentsOf: URL),另一类是针对内存Data,如init(data: Data),初始化参考代码如下所示:

NSURL *fileURL = ...; self.player = ... if (self.player) {     [self.player prepareToPlay]; }

在初始化的时候建议先调用prepareToPlay(),是因为会在调用play()方法之前获取需要的音频硬件并预加载AudioQueue缓冲区,可以降低调用play()方法和听到声音输出之间的时延。如果不调用prepareToPlay()方法,在调用play()方法时也会隐式调用类似于prepareToPlay()之类的方法来激活音频

AVAudioPlayer提供了一些列关于播放的生命周期控制方法,如下所示:

  • play():正式播放音频,可重新恢复被 pause 和 stop 停止的音频
  • pause():暂停音频播放,可从 play 重新恢复,但不清除掉prepareToPlay 的内容
  • stop():停止音频播放,清除掉 prepareToPlay 的内容,可从 play 重新恢复

AVAudioPlayer也提供了一部分音频控制的属性变量,如下所示:

  • volume:修改播放器的音量,范围从0.0~1.0,单位是浮点值
  • pan:播放器的声道,范围从-1(极左)到1.0(极右),默认值是0.0(居中)
  • rate:调整播放速率,从0.5~2.0
  • numberOfLoops: 循环播放次数,n > 0,实现 n 次播放,n = -1,表示无限循环
  • isMeteringEnabled: 是否启动音频计量,即输出音频的可视化计量数据
后台播放

在播放音频时,一个很常用的场景就是让App退出前台后,依然能在后台持续不断的播放音频直至用户停止。

想要在后台也能播放音频其实也不难,只需要两个步骤:

  1. 将音频会话的会话分类设置为Playback,该会话能让音频在手机静音情况下正常播放
  2. 需要在Info.plist文件中添加一个Required background modes类型数组,添加一个item项为App plays audio or streams audio/video using AirPlay

通过以上这两步,便可以让音频播放继续在后台服务。

中断处理

音频在播放时,有时候也会受到电话呼叫或Face Time呼叫,导致音频突然被中断,等到用户拒绝或者呼叫结束时,音频又开始从暂停位置重新播放。这一系列操作的成功实现,需要依赖AVAudioSession的中断通知,通过监听中断通知,当中断开始或中断结束,系统都会告诉外界发生的变化,示例代码如下所示:

func setupNotifications() {     let nc = NotificationCenter.default     nc.addObserver(self,                    selector: #selector(handleInterruption),                    name: AVAudioSession.interruptionNotification,                    object: AVAudioSession.sharedInstance) }  @objc func handleInterruption(notification: Notification) {  }
  • 中断通知会包含一个带有重要信息的userInfo,根据这个字典来决定音频的行为,暂停还是播放
  • handleInterruption(notification:):用来集中处理中断通知

handleInterruption(notification:)中处理中断通知的代码示例:

@objc func handleInterruption(notification: Notification) {     guard let userInfo = notification.userInfo,         let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,         let type = AVAudioSession.InterruptionType(rawValue: typeValue) else {             return     }      switch type {      case .began:      case .ended:          guard let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else { return }         let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)         if options.contains(.shouldResume) {          } else {          }      default: ()     } }

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 播放和录制音频求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们