用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实现自动录音的功能,希望大家能够喜欢

(0)

相关推荐

  • Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍

    1.UITapGestureRecognizer 点击/双击手势 复制代码 代码如下: var tapGesture = UITapGestureRecognizer(target: self, action: "handleTapGesture:")  //设置手势点击数,双击:点2下  tapGesture.numberOfTapsRequired = 2  self.view.addGestureRecognizer(tapGesture) 2.UIPinchGestureRec

  • Swift在控件中添加点击手势的方法

    今天有同行问我,如何在tableview的headerview中添加点击方法,今天就来简简单单说明一下,在swift中添加点击手势的方法是: 复制代码 代码如下: imagepath.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "imagePathClick:")) 怎么样,看上去是不是比oc简单多了呢,简单解释一下,imagePath是我定义的一个UIImageView,可能有人添加了这个手势之后

  • 用Swift编写自动录音器

    用swift编写自动录音器,自动录音和一般录音的不同点在于:不需要像微信里面需要按下录音然后松手结束,而是根据说话声音的大小自动判断该录音和该停止的点,然后可以等到录音结束之后马上播放出来.此效果很像会说话的汤姆猫那样. 在自动录音的初始化阶段需要建立两个录音对象,一个需要一直录音充当监听器的功能,另一个用来在需要的时刻录音.具体流程大致如下 准备工作 这个项目使用swift写的,设置的成员变量如下 如果你不是在董铂然博客园看到本文请点击查看原文. // 录音器 var recoder:AVAu

  • IOS开发OC代码中创建Swift编写的视图控制器

    IOS开发OC代码中创建Swift编写的视图控制器 背景 近日在和一群朋友做项目,我和另一位同学负责iOS客户端,我是一直使用OC的,而他只会Swift,因此在我们分工协作之后,就需要把代码合在一起,这就牵扯到如何在TabbarController中添加一个swift创建的子控制器的问题. 解决 首先在一个OC项目中新建一个Swift类,继承自UITableViewController,并且修改其view背景色,方便后续测试. import UIKit class ESSwiftTableVie

  • Android 实现电话来去自动录音的功能

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

  • 图片自动播放器脚本之家修正

    图片自动播放器我们修正,可以兼容ff,发现些小问题,希望大家多多讨论,使用方法呢 复制代码 代码如下: ImgName=new ImgArray(3);  ImgName[0]="4.jpg";  ImgName[1]="1.jpg";  ImgName[2]="2.jpg";  ImgName[3]="3.jpg"; 只需修改上面的地方即可,加了图片预载,转载请写明出处,剩下的大家来完善吧 图片自动播放器我们修正 funct

  • 浅析Python编写函数装饰器

    编写函数装饰器 本节主要介绍编写函数装饰器的相关内容. 跟踪调用 如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息. class tracer: def __init__(self,func): self.calls = 0 self.func = func def __call__(self,*args): self.calls += 1 print('call %s to %s' %(self.calls, self.func.__name__)

  • C#开发答题赢钱游戏(自动答题器)

    一.前言 现在最火的直播游戏,那就是答题赢钱直播了,如百万英雄.芝士超人.花椒直播.冲顶大会等等,这些游戏的玩法都很简单,答对12题即可瓜分奖金了.玩法虽然简单,但是要能完全答对12题难度还是挺高的,毕竟要非常广的知识面! 二.怎么做自动答题 要能自动答题,肯定是要能知道题目及答案了.题目可以从直播界面获取,方法就是OCR或者搞到数据接口了---嘿嘿,都说了简单教你,所以OCR或者分析数据接口这些复杂的操作,我肯定不教你了(我也不会啊^_%)-- 幸好,现在市面上有一些非常有技术"逼格"

  • 易语言编写mp3播放器教学

    易语言是一款可视全中文的编程语言,由于他有可视化程度高,全中文的特点,深受国人喜爱,下面我为大家讲解如何用易语言编写mp3播放器. 1.打开易语言,新建一个windows窗口程序. 2.在启动窗口上,放上编辑框,按钮,通用对话框等组件. 3.通用对话框的属性中,类型一定要是打开文件. 4.双击按钮1,写入代码如下图所示 5.双击按钮2,写入代码如下图所示. 6.点击运行,点击按钮1,可见通用对话框的功能之一,打开文件,实现了,选择一个mp3文件,点击打开,可见编辑框1的内容就是通用对话框的文件名

  • python编写实现抽奖器

    本文实例为大家分享了python编写实现抽奖器的具体代码,供大家参考,具体内容如下 # coding=utf-8 import sys import os import openpyxl if sys.version_info[0] == 2: import Tkinter from Tkinter import * else: import tkinter as Tkinter from tkinter import * from tkinter import messagebox impor

  • android实现通话自动录音服务

    本文实例为大家分享了android实现通话自动录音服务的具体代码,供大家参考,具体内容如下 需求: ①:通话自动录音: ②:无界面,只是一个service: ③:录音自动压缩上传: ④:当用户清理后台的时候,要求service不可以被杀死: ⑤:稳定性:1.无网络的情况下:2.上传失败:3.服务报错. 解决方案: ①:通话自动录音 启动一个service,监听用户手机通话状态,当检测到用户处于通话状态下,立即开始录音,通话结束后,停止录音,并保存文件. 此功能的前提条件: 1.录音权限.读写存储

  • Android实现通话自动录音

    最近需要做一个类似于电话客户的功能,要求拨打电话能自动录音.所以写了一个dome,希望能够帮到大家. 主要思路就是监听手机通话状态在监听到接听时开始录音,结束停止录音. AndroidManifest中配置 <!-- 权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android

随机推荐