1,技术介绍

(1)AVFoundation.framework框架提供了AVAudioRecorder类。它可以实现录音功能。

(2)而使用该框架的AVAudioPlayer类,可以实现声音的播放。
2,下面制作一个录音机样例
(1)按住录音按钮则开始录音,松开则停止录音。录音文件保存在用户文件夹下。
(2)录音过程中会实时显示声音的音量大小(这个可以用来做声音脉冲图,获得更好的展示效果)
(3)点击播放录音则可播放录制的声音文件。
3,效果图如下:
4,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import UIKit
import AVFoundation
 
class ViewController: UIViewController {
     
    var recorder:AVAudioRecorder? //录音器
    var player:AVAudioPlayer? //播放器
    var recorderSeetingsDic:[NSObject:AnyObject]? //录音器设置参数数组
    var volumeTimer:NSTimer! //定时器线程,循环监测录音的音量大小
    var aacPath:String? //录音存储路径
     
    @IBOutlet weak var volumLab: UILabel! //显示录音音量
 
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //初始化录音器
        let session:AVAudioSession = AVAudioSession.sharedInstance()
        //用于获取失败原因
        var error:NSError?
        //设置录音类型
        session.setCategory(AVAudioSessionCategoryPlayAndRecord, error: &error)
        //设置支持后台
        session.setActive(true, error: &error)
        //获取Document目录
        let docDir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,
            .UserDomainMask, true)[0] as! String
        //组合录音文件路径
        aacPath = docDir + "/play.aac"
        //初始化字典并添加设置参数
        recorderSeetingsDic = Dictionary()
        recorderSeetingsDic!.updateValue(NSNumber(long: kAudioFormatMPEG4AAC), forKey: AVFormatIDKey)
        //录音器每秒采集的录音样本数
        recorderSeetingsDic!.updateValue(NSNumber(long: 1000), forKey: AVSampleRateKey)
        //录音的声道数,立体声为双声道
        recorderSeetingsDic!.updateValue(NSNumber(long: 2), forKey: AVNumberOfChannelsKey)
        //采样位数
        recorderSeetingsDic!.updateValue(NSNumber(long: 8), forKey: AVLinearPCMBitDepthKey)
        //大端还是小段,是内存的组织方式
        recorderSeetingsDic!.updateValue(NSNumber(bool: false), forKey: AVLinearPCMIsBigEndianKey)
        //采样信号是整数还是浮点
        recorderSeetingsDic!.updateValue(NSNumber(bool: false), forKey: AVLinearPCMIsFloatKey)       
    }
 
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
 
    //按下录音
    @IBAction func downAction(sender: AnyObject) {
        var error:NSError?
        //初始化录音器
        recorder = AVAudioRecorder(URL: NSURL(string: aacPath!),
            settings: recorderSeetingsDic, error: &error)
        if recorder != nil {
            //开启仪表计数功能
            recorder!.meteringEnabled = true
            //准备录音
            recorder!.prepareToRecord()
            //开始录音
            recorder!.record()
            //启动定时器,定时更新录音音量
            volumeTimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self,
                selector: "levelTimer", userInfo: nil, repeats: true)
        }
    }
 
    //松开按钮,结束录音
    @IBAction func upAction(sender: AnyObject) {
        //停止录音
        recorder?.stop()
        //录音器释放
        recorder = nil
        //暂停定时器
        volumeTimer.invalidate()
        volumeTimer = nil
        volumLab.text = "录音音量:0"
    }
     
    //播放录制的声音
    @IBAction func playAction(sender: AnyObject) {
        var error:NSError?
        //播放
        player = AVAudioPlayer(contentsOfURL: NSURL(string: aacPath!), error: &error)
        if player == nil {
            print("播放失败:\(error?.description)")
        }else{
            player?.play()
        }
    }
     
    //定时检测录音音量
    func levelTimer(){
        recorder!.updateMeters() // 刷新音量数据
        let averageV:Float = recorder!.averagePowerForChannel(0) //获取音量的平均值
        let maxV:Float = recorder!.peakPowerForChannel(0) //获取音量最大值
        let lowPassResult:Double = pow(Double(10), Double(0.05*maxV))
        volumLab.text = "录音音量:\(lowPassResult)"
    }
}

Swift - 制作一个录音机(声音的录制与播放)的更多相关文章

  1. Swift 制作一个新闻通知中心插件1

    使用 Swift 制作一个新闻通知中心插件(1) 随着 iOS 8 的发布,苹果为开发者们开放了很多新的 API,而在这些开放的接口中 通知中心插件 无疑是最显眼的一个.通知中心就不用过多介绍了,相信 ...

  2. Swift - 制作一个在线流媒体音乐播放器(使用StreamingKit库)

    在之前的文章中,我介绍了如何使用 AVPlayer 制作一个简单的音乐播放器(点击查看1.点击查看2).虽然这个播放器也可以播放网络音频,但其实际上是将音频文件下载到本地后再播放的. 本文演示如何使用 ...

  3. 使用 Swift 制作一个新闻通知中心插件(1)

    input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...

  4. 使用 Swift 制作一个新闻通知中心插件(2)

    我们在第一部分的文章中详细讲解了创建一个通知中心插件的整体过程.我们成功的在通知中心里面显示了新闻列表.但是截止到目前,我们还不能从通知中心的列表中查看新闻的详细内容.在这次的教程中,我们就以上次的教 ...

  5. 用 Swift 制作一个漂亮的汉堡按钮过渡动画

    汉堡按钮在界面设计中已经是老生常谈了,但是当我在dribbble看到这个漂亮的过渡动画时,我决定试试用代码实现它.   这是 CreativeDash team 的原型图: 你可能已经注意到了,汉堡顶 ...

  6. Swift 中使用 SwiftyJSON 制作一个比特币价格 APP

    Swift 中处理 JSON 数据有很多种方式,可以使用原生的 NSJSONSerialization,也可以使用很多第三方库.原生的 NSJSONSerialization 方式这篇文章中介绍过.这 ...

  7. Swift - 使用UIWebView和UIToolbar制作一个浏览器

    使用网页控件(UIWebView)与工具栏控件(UIToolbar),我们可以自制一个小型的浏览器,其功能如下: 1,输入网址,点击“Go”按钮加载网页 2,加载过程中有进度条,同时可以点击停止按钮取 ...

  8. 使用CocosSharp制作一个游戏 - CocosSharp中文教程

    注:本教程翻译自官方<Walkthrough - Building a game with CocosSharp>,官方教程有很多地方说的不够详细,或者代码不全,导致无法继续,本人在看了G ...

  9. 用Phaser来制作一个html5游戏——flappy bird (二)

    在上一篇教程中我们完成了boot.preload.menu这三个state的制作,下面我们就要进入本游戏最核心的一个state的制作了.play这个state的代码比较多,我不会一一进行说明,只会把一 ...

随机推荐

  1. 图的DFS递归和非递归

    看以前写的文章: 图的BFS:http://www.cnblogs.com/youxin/p/3284016.html DFS:http://www.cnblogs.com/youxin/archiv ...

  2. 通过加索引对sql语句优化

    今天看数据库的时候遇到这样一个SQL语句: select substr(a.djxh,) as id, (a.nd || a.yf) DECL_YM, a.zspm_dm as LEVY_ITEM_I ...

  3. Android Touch事件传递机制具体解释 上

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/37961997 近期总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,曾经 ...

  4. 历时一年,我的著作《第一行代码——Android》已出版!

    前言 事实上我当初决定開始写博客的想法挺简单的,认为自己搞技术这么多年了,总应该要留下点什么.既然没能写出什么出色的应用,那至少也要留下点文字分享给大家,以指引在我后面的开发人员们,毕竟我也从前辈们的 ...

  5. Phalcon框架中的另类使用

    不像传统的PHP框架,假设框架想被还有一个框架使用仅仅能通过rpc或是引入文件等的方式.Phalcon能够在其他框架中直接使用.这是因为Phalcon是以扩展的形式存在的,在server载入时会直接载 ...

  6. db2 xml 转 table【XQuery系列】

    版本号:DB2 Version 9.1 1.创建測试表,初始化数据 create table emp (doc XML);   INSERT INTO EMP VALUES ('<dept bl ...

  7. UITabbar的常用属性

    // //设置tabbar的背景颜色 // [self.tabBar setBarTintColor:[UIColor redColor]]; // //设置选中时图片和文字的颜色 // [self. ...

  8. B - 畅通工程(并查集)

    对并查集理解之后就可以做这种题了,虽说这种题做的不多,这道题做过才这么快搞定,可是还是挺happy滴,加油 Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接 ...

  9. 64位系统/32位系统下/8位CPU的数据宽度

    不同的编译器根据不同的 64 位模型有所不同. 比如 Visual C++,从第一个支持 64 位的版本起,一直就是使用 LLP64 内存模型,也就是说,编译出的代码除了 long 和指针是 64 位 ...

  10. sql执行疑问

    遇到一个奇怪的事情,学习执行计划的时候写了这么一个sql来看执行计划的执行顺序, SELECT COUNT(*) FROM SIC84 WHERE AAC001 IN (SELECT AAC001 F ...