用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。原生的好像就找到这一个其他的改声调等应该还需要引用第三方库。

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

时间: 2024-10-13 22:10:47

用swift实现自动录音器的相关文章

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

作用AVPLayer:可以用来播放在线及本地音视频AVAudioSession:音频会话,主要用来管理音频设置与硬件交互使用时需要导入 #import <AVFoundation/AVFoundation.h> AVAudioSession中配置选项: AVAudioSessionCategory 注意:除了 AVAudioSessionCategoryMultiRoute 外,其他的 Category 都遵循 last in wins 原则,即最后接入的音频设备作为输入或输出的主设备. 1.

Swift的自动引用计数

前言 在iOS5之后apple推出了相对于MRC(Mannul Reference Counting)的ARC(Automatic Reference Counting)的内存管理机制,前者是对内存的手动管理,后者是系统对内存的智能化管理.其实我学习iOS的时候已经推出到iOS7了,对于MRC机制我甚至连一知半解都算不上.有时候和iOS老司机交流的时候他们对于各种内存都很熟悉,感觉包括我在内的很多最近两年刚学习iOS开发的同学,都属于填鸭式的学习吧,知其然不知其所以然,甚至都没耐心去读优秀的源码

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

开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也不禁地对编译器内部到底为我们做了哪些事儿而感到好奇?于是,我们就借助反编译神器,去看看编译器到底做了啥事!其实本篇中很多都不算新语法,对于很多人来说可能都是接触了很久了,这里主要是针对.NET的老版本来说,是一个“相对”的新语法. /* 新语法索引 */ 1.自动属性 Auto-Implemente

WinForm通用自动更新器AutoUpdater项目实战

一.项目背景介绍 最近单位开发一个项目,其中需要用到自动升级功能.因为自动升级是一个比较常用的功能,可能会在很多程序中用到,于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件,并添加少量代码,即可实现自动升级功能.因为我们的程序中可能包含多个类型的文件,比如exe.dll. config.xml.bat等等自定义格式的后缀名文件,所以要支持多文件类型的更新. 本期同样带给大家分享的是阿笨在实际工作中遇到真实项目场景,请跟随阿笨的视角去如何开发实现WinForm通用自动更新

python爬虫实战——5分钟做个图片自动下载器

python爬虫实战--图片自动下载器 制作爬虫的基本步骤 顺便通过这个小例子,可以掌握一些有关制作爬虫的基本的步骤. 一般来说,制作一个爬虫需要分以下几个步骤: 分析需求(对,需求分析非常重要,不要告诉我你老师没教你) 分析网页源代码,配合F12(没有F12那么乱的网页源代码,你想看死我?) 编写正则表达式或者XPath表达式(就是前面说的那个神器) 正式编写python爬虫代码 效果 运行: 恩,让我输入关键词,让我想想,输入什么好呢?好像有点暴露爱好了. 回车 好像开始下载了!好赞!,我看

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

我们在使用Android手机打电话时,有时可能会需要对来去电通话自动录音,本文就详细讲解实现Android来去电通话自动录音的方法,大家按照文中的方法编写程序就可以完成此功能. 来去电自动录音的关键在于如何监听手机电话状态的转变: 1)来电的状态的转换如下(红色标记是我们要用到的状态) 空闲(IDEL)——> 响铃(RINGING)——> 接听(ACTIVE)——> 挂断(经历DISCONNECTING——DISCONNECTED)——> 空闲(IDEL) 或者  空闲(IDEL)

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

python爬虫实战--图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识,大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk is cheap show me the code! 制作爬虫的基本步骤 顺便通过这个小例子,可以掌握一些有关制作爬虫的基本的步骤. 一般来说,制作一个爬虫需要分以下几个步骤: 1. 分析需求(对,需求分析非常重要,不要告诉我你老师没教你) 2. 分析网页源代码,配合F12(没有F12那么乱的网页源代码,你想看死我?) 3. 编写正则表达式或

Delphi制作QQ自动登录器源码

Delphi制作QQ自动登录器源码 http://www.cnblogs.com/sunsoft/archive/2011/02/25/1964967.html 以TM2009为例,检查了一下,未登录之前一个窗体,上边两个控件,登录以后,窗体捕获到一个控件,根据这个,首先找到QQ登录框,输入用户名,密码的位置,获取窗体句柄的具体代码如下: 这里先定义了一个record类型, 1   TQQWnd= record 2     QQWnd,QStatusWnd: HWND;  //QQ窗口句柄,QQ

swift:自动引用计数ARC

Swift自动引用计数:ARC Swift使用自动引用计数(ARC)来跟踪并管理应用使用的内存.大部分情况下,这意味着在Swift语言中,内存管理"仍然工作",不需要自己去考虑内存管理的事情.当实例不再被使用时,ARC会自动释放这些类的实例所占用的内存. 然而,在少数情况下,为了自动的管理内存空间,ARC需要了解关于你的代码片段之间关系的更多信息.本章描述了这些情况,并向大家展示如何打开ARC来管理应用的所有内存空间. 注意:引用计数只应用在类的实例.结构体(Structure)和枚举