用Swift编写自动录音器

 更新时间:2015年07月27日 15:55:10   作者:董铂然  
这篇文章主要介绍了用Swift编写自动录音器,有需要的朋友可以借鉴下

用swift编写自动录音器,自动录音和一般录音的不同点在于:不需要像微信里面需要按下录音然后松手结束,而是根据说话声音的大小自动判断该录音和该停止的点,然后可以等到录音结束之后马上播放出来。此效果很像会说话的汤姆猫那样。

在自动录音的初始化阶段需要建立两个录音对象,一个需要一直录音充当监听器的功能,另一个用来在需要的时刻录音。具体流程大致如下

准备工作
这个项目使用swift写的,设置的成员变量如下

如果你不是在董铂然博客园看到本文请点击查看原文。

// 录音器
var recoder:AVAudioRecorder!
// 监听器
var monitor:AVAudioRecorder!
// 播放器
var player:AVAudioPlayer!
// 定时器
var timer:NSTimer!
// 录音器的URL
var recordURL:NSURL!
// 监听器的URL
var monitorURL:NSURL!

当然这些属性不能直接敲出来需要先引入一个桥接文件并导入#import <AVFoundation/AVFoundation.h>

导入如果出现问题可以看下此文 : 怎么让OC与swift混合开发

在程序启动时应将录音器,监听器,定时器一同初始化。

在那之前需要先设置好音频的保存质量,这其中会用到很多库里自带的key,AVSampleRateKey,AVFormatIDKey,AVNumberOfChannelsKey,AVEncoderAudioQualityKey这些key对应的值一般为double类型或int类型。一一解释没有必要,大概意思就是保存声音的Hertz(类似于QQ音乐的无损和普通),转化率,保存的声道,声音品质等等。有兴趣的可以仔细去头文件里研究研究。我就查了下所有参数的最高品质发现录完之后大小也可以接受就用最高品质了。(但是微信说话那种发的应该是中下品质,省流量且时效性为主)

复制代码 代码如下:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, error:nil)
var recoderSetting:NSDictionary = NSDictionary(objectsAndKeys: 14400.0,AVSampleRateKey,kAudioFormatAppleIMA4,AVFormatIDKey,2,AVNumberOfChannelsKey,0x7F,AVEncoderAudioQualityKey)


这其中有个参数应该是AVAudioQuality.Max类型但是swift不能识别,就直接查看里面的常量用十六进制填进去了。总的来说就是先用一个字典把所有的键值对都存好然后这个字典会用在后面实例化录音器中的一个参数。

初始化录音器的方法如下,监听器完全相似只需要另改一个URL

复制代码 代码如下:

// 实例化录音器
var recordPath = NSTemporaryDirectory().stringByAppendingPathComponent("record.caf")
recordURL = NSURL.fileURLWithPath(recordPath)
recoder = AVAudioRecorder(URL: recordURL, settings:recoderSetting as [NSObject : AnyObject], error: nil)

 
开始录音
核心功能是录音,录音的原理是监听声音分贝的大小,自己设置临界点开启和关闭录音。

如果声音一直很小不作处理。
如果声音大了先判断现在是否在录音如果没有则开始录音。
如果声音小了先判断现在是否在录音如果在录音则停止录音。

func updateTimer(){
 
 // 更新测量器
 self.monitor.updateMeters()
 // 获得说话的分贝
 var power = self.monitor.peakPowerForChannel(0);
 
 println("-----》\(power)")
 
 if (power > -30){
 if(!self.recoder.recording){
  println("开始录音")
  self.recoder.record()
 }
 }else {
 if(self.recoder.recording){
  println("结束录音")
  self.recoder.stop()
  self.play()
 }
 
 }

尝试的结果如下打印,其中数值就是一直监听分贝数。极安静的情况下是-160 嘈杂环境一般是-40起。

播放声音
录音完成后可以直接设置马上播放声音

func play(){
 timer.invalidate()
 monitor.stop()
 // 删除录音缓存
 monitor.deleteRecording()
 player = AVAudioPlayer(contentsOfURL: recordURL, error: nil)
 player.delegate = self
 player.play()
}

上面图中的定时器停止-监听器停止-删除监听器的缓存 在这块代码中都有体现。这里建议设置一下代理,因为即使是播放一次在播放完成后也很可能会做一些额外操作,并且此项目的期望是能够循环的录音播放。即播放完打开定时器,监听器重新开始总流程。

 
延展操作
代理遵守的是AVAudioPlayerDelegate 。并实现代理方法,在代理方法中调用之前开启的方法

func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool) {
 // 重新开启定时器
 self.setupTimer()
}
func setupTimer(){
 self.monitor.record()
 self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "updateTimer", userInfo: nil, repeats: true)
}

到此为止一个完整的录音流程就结束了。

也可以做一些特殊操作就是类似于会说话的汤姆猫并不是把你说的话原话说出,而是对声音做了一定的处理再说出的。如果想实现此功能需要再声音播放前,先开启声音预播放,并且设置一些更改声音的操作最后再播放以达到目的。大部分的属性在修改前都需要打开一个BOOL值才能操作。举例如下(把上面的play()换成下面代码

复制代码 代码如下:

// 允许更改速度
player.enableRate = true
// 设置速度
player.rate = 2
player.play()

这个属性rate的取值范围是0.5到2.0。原生的好像就找到这一个其他的改声调等应该还需要引用第三方库。

以上内容就是用Swift实现自动录音的功能,希望大家能够喜欢

相关文章

  • swift中AnyObject和Any的介绍与区别详解

    swift中AnyObject和Any的介绍与区别详解

    虽然使用swift开发了一段时间,但是感觉对一些基础的东西了解不是比较透彻,在查询了许多资料以后还是打算自己动手记录一下,下面这篇文章主要给大家介绍了关于swift中AnyObject和Any的介绍与区别的相关资料,需要的朋友可以参考下。
    2017-12-12
  • Swift、Objective-C、Cocoa混合编程设置指南

    Swift、Objective-C、Cocoa混合编程设置指南

    这篇文章主要介绍了Swift、Objective-C、Cocoa混合编程设置指南,需要的朋友可以参考下
    2014-07-07
  • Swift调用Objective-C代码

    Swift调用Objective-C代码

    目前Swift语言所编写的应用才刚刚可以使用Xcode 6 GM版本提交,而Objective-C作为苹果的主开发语言存在了很多年了。目前尚无成熟的Swift库可用,所以当前编写应用可以说基本离不开调用Objective-C代码的情况。
    2014-09-09
  • Swift使用transform 实现重复平移动画效果

    Swift使用transform 实现重复平移动画效果

    这篇文章主要介绍了Swift使用transform 实现重复平移动画效果,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • Swift心得笔记之函数

    Swift心得笔记之函数

    函数是执行特定任务的代码自包含块。通过给定一个函数名称标识它是什么,并在需要的时候使用该名称来调用函数以执行任务。今天我们就来探讨下swift中的函数问题。
    2015-04-04
  • 在Swift中使用Objective-C编写类、继承Objective-C类

    在Swift中使用Objective-C编写类、继承Objective-C类

    这篇文章主要介绍了在Swift中使用Objective-C编写类、继承Objective-C类等操作方法介绍,需要的朋友可以参考下
    2014-07-07
  • 如何在Swift 中使用 async let 并发运行后台任务

    如何在Swift 中使用 async let 并发运行后台任务

    Swift 异步编程是一种编写允许某些任务并发运行而不是按顺序运行的代码的方法,这篇文章主要介绍了在Swift中使用async let并发运行后台任务,需要的朋友可以参考下
    2023-06-06
  • Swift简单快速的动态更换app图标AppIcon方法示例

    Swift简单快速的动态更换app图标AppIcon方法示例

    这篇文章主要为大家介绍了Swift动态更换app图标AppIcon的简单快速方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Swift免费短信验证码实现及动态倒计时功能

    Swift免费短信验证码实现及动态倒计时功能

    这篇文章主要介绍了Swift免费短信验证码实现及动态倒计时功能的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • Swift学习笔记之逻辑分支与循环体

    Swift学习笔记之逻辑分支与循环体

    这篇文章主要给大家介绍了关于Swift学习笔记之逻辑分支与循环体的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12

最新评论