基本介绍

自动录音与一般录音区别在:不用像微信那样按下录音-松手结束,而是根据说话声音的大小自动判断该录音和该停止的点,然后可以做到结束录音之后马上播放出来。类似于达到会说话的汤姆猫那样的效果。

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

准备工作

这个项目使用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实现自动录音器的更多相关文章

  1. Swift实现iOS录音与播放音频功能

    作用AVPLayer:可以用来播放在线及本地音视频AVAudioSession:音频会话,主要用来管理音频设置与硬件交互使用时需要导入 #import <AVFoundation/AVFound ...

  2. swift 学习- 17 -- 析构器

    // 析构器 只适用与 类类型, 当一个类的实例被释放之前, 析构器会被立即调用, 析构器用关键字 deinit 来标示, 类似于构造器要用 init 来标示 // 析构过程原理 // Swift 会 ...

  3. 录音器 AudioRecorder

    实现录音器有两种方式可以选择: 1.AudioRecord(基于字节流录音) 优点:可以实现语音的实时处理,进行边录边播,对音频的实时处理. 缺点:输出的是PCM的语音数据,如果保存成音频文件是不能被 ...

  4. .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

    开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...

  5. Android 录音器

    Android自带的mediarecoder录音器不含pause暂停功能,解决方法:录制多个音频片段,最后合成一个文件. 参照 : http://blog.csdn.net/a601445984/ar ...

  6. 【图文详解】python爬虫实战——5分钟做个图片自动下载器

    python爬虫实战——图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识,(没看的先去看!!)大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk is cheap sho ...

  7. swift:自动引用计数ARC

    Swift自动引用计数:ARC    原文链接:https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapte ...

  8. 手把手教你Android来去电通话自动录音的方法

    我们在使用Android手机打电话时,有时可能会需要对来去电通话自动录音,本文就详细讲解实现Android来去电通话自动录音的方法,大家按照文中的方法编写程序就可以完成此功能. 来去电自动录音的关键在 ...

  9. iOS8 Core Image In Swift:自动改善图像以及内置滤镜的使用

    iOS8 Core Image In Swift:自动改善图像以及内置滤镜的使用 iOS8 Core Image In Swift:更复杂的滤镜 iOS8 Core Image In Swift:人脸 ...

随机推荐

  1. oracle表数据类型number对应java中BIgDecimal转int

    oracle中id为number类型,在java获取id时用getBigDecimal 相匹配, 如果想转换成int,重写model中的getInt方法: public Integer getInt( ...

  2. 使用log4j配置不同文件输出不同内容

    敲代码中很不注意写日志,虽然明白很重要.今天碰到记录日志,需要根据内容分别输出到不同的文件. 参考几篇文章: 感觉最详细:http://blog.csdn.net/azheng270/article/ ...

  3. 多语言架构下如何正确的使用SQL视图

    产品的定位 做产品的都知道,是否支持多语言直接影响到产品的定位问题. 如果一个产品周期是一年的话,要完美支持多语言最少也得在加3个月!所需时间和页面数量.数据库表的数量和表的数据量成正比. 可以看出代 ...

  4. 基于HT for Web的3D树的实现

    在HT for Web中2D和3D应用都支持树状结构数据的展示,展现效果各异,2D上的树状结构在展现层级关系明显,但是如果数据量大的话,看起来就没那么直观,找到指定的节点比较困难,而3D上的树状结构在 ...

  5. [译]学习IPython进行交互式计算和数据可视化(六)

    第五章:高性能并行计算 一个反复被提及的反对使用Python进行高性能数值计算的言论是这种语言是动态解释型的,速度太慢.一种编译型低级语言,如C,能提供比它快几个数量级的运算速度.我们在第三章--使用 ...

  6. EDNS

    随着业务的复杂化和多样化,RFC1035中定义的DNS消息格式和它支持的消息内容已经不足以满足一些DNS服务器的需求,于是,RFC2671中提出了一种扩展DNS机制EDNS(Extension Mec ...

  7. 枚举 + 进制转换 --- hdu 4937 Lucky Number

    Lucky Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)To ...

  8. ASP.NET MVC系列:添加模型

    模型(Model)是应用程序中用于处理应用程序数据逻辑的部分;通常模型对象在数据库中存取数据 添加模型类 在解决方案中右击Models文件夹,然后选择“添加”,在“添加”项里选择“类”:或者选中Mod ...

  9. C# 解析html —— 将html转为XHTML,然后利用Xml解析

    呵呵,由于正则不熟,所以另谋出路——利用XML去解析html. 要想将抓取到的数据(直接抓取到的是byte[])  转为XML文档(即XMLDocument对象),有两个要点: 一.判断编码(http ...

  10. 基于cookie实现zTree树刷新后,展开状态不变

    1.除了引用jQuery和zTree的JS外,引用cookie的JS: <script type="text/javascript" src="~/Scripts/ ...