Swift - 制作一个录音机(声音的录制与播放)

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)"

    }

}

时间: 2024-10-17 04:04:32

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

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

input[type="date"].form-control,.input-group-sm>input[type="date"].input-group-addon,.input-group-sm>.input-group-btn>input[type="date"].btn,input[type="time"].input-sm,.form-horizontal .form-group-sm input

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

我们在第一部分的文章中详细讲解了创建一个通知中心插件的整体过程.我们成功的在通知中心里面显示了新闻列表.但是截止到目前,我们还不能从通知中心的列表中查看新闻的详细内容.在这次的教程中,我们就以上次的教程为基础,继续将我们的通知中心插件的功能改进完善.如果您没有看过第一部分的教程,就请先参看教程的 第一部分. 新闻阅读界面 我们在上一篇教程中,已经完成了通知中心插件的新闻列表显示,但是我们点击这个新闻列表中的新闻条目,是没有任何反应的.所以我们在这里需要一个详细页面来显示这个新闻列表. 回到我们的

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

Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如何用Phaser来制作一个前段时间很火爆的游戏:Flappy Bird,希望大家看后也能做出自己的html5游戏.大家可以先点击这里来试玩一下我已经做好的这个游戏,感受一下Phaser的游戏效果,游戏的完整代码我已经放到github上了.支持的浏览器:IE9+.Firefox.Chrome.Opera.Safari以及移动端的能支持html5的浏览器,推荐使用谷歌浏览器,

Swift是一个提供RESTful HTTP接口的对象存储系统

Swift是一个提供RESTful HTTP接口的对象存储系统,最初起源于Rackspace的Cloud Files,目的是为了提供一个和AWS S3竞争的服务. Swift于2010年开源,是OpenStack最初的两个项目之一.然而,在国内OpenStack圈里,不太能够听到关于Swift的声音,究其原因正如本系列的第一篇<文件系统vs对象存储——选型和趋势>)中所说的,RESTful HTTP接口的对象存储,主要为互联网应用服务,而OpenStack厂商最关心的传统行业的用户目前能够应用

Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

提要 此篇是一个国外教程的翻译,虽然有点老,但是适合新手入门.自己去写代码,debug,布置场景,可以收获到很多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一篇中,我们学会了怎么在Unity中搭建游戏的场景,并且设置模型的物理属性. 在第二篇中,我们学会了怎么在unity中使用脚本,并且创建了大部分的游戏逻辑,包括投球和得分! 在这最后一节中,我们将会为用户创建一个菜单系统,并且和GameController进行交互,我们开始吧. 在设备上测试 到目前为止,

(三十)unity4.6学习Ugui中文文档-------制作一个泛型的MODAL窗口

孙广东 2015.5.11 在此文章中我们将制作一个泛型的MODAL窗口 (Yes, No, Maybeso, Cancel) 在那里我们可以把内容和动作push到窗口中,这个窗口可以在我们的游戏的任何地方使用,按钮被按下时事件工作. 涉及到的代码: using UnityEngine; using System.Collections; public class BringToFront : MonoBehaviour { void OnEnable () { transform.SetAsL

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

注:本教程翻译自官方<Walkthrough - Building a game with CocosSharp>,官方教程有很多地方说的不够详细,或者代码不全,导致无法继续,本人在看了GoneBananas项目代码后,对本教程进行了部分修改,但当前只涉及Android方面,iOS因没有环境验证代码,暂未修改. 本人博客地址:http://fengyu.name 原文链接:http://fengyu.name/?cat=game&id=295 相关资源: 离线PDF文档:Downloa

使用cocos制作一个简易的小闹钟

使用cocos制作一个简易的小闹钟 本文转载至学习使用Cocos制作<闹钟> 使用的引擎版本是cocos2.1 具体开发过程指导 (1)Cocos Studio部分 1.打开Cocos工具,新建一个项目: 2.设置好相关的配置,点击完成,从而发布到Cocos Studio中: 3.Cocos Studio IDE介绍: 左上角的是开发常用的游戏元素.UI控件.容器等,可以像VS2013一样拖拽,并在右边设置对应的属性:左下角是资源导入,可以导入所需的图片背景:下面是时间戳,用于设置基于时间戳的

如何制作一个有网络营销效果的企业网站呢

如何制作一个有网络营销效果的企业网站呢? 这是一个普遍企业建站所要达到的最终目的,以前企业网站建设所仅仅要传递和表达的是企业形象,于是片面注重网页的美观而忽视了网站它本来的价值,比如首页设置为一个大大的FLASH动画,镶入多多优美的图片等等.当然,这并不是说首页用动画或图片来展示有什么错或者它就没了营销效果,只不过可以肯定的一点就是它没有比同样一个无动画少图片的网页所带来的效果那么大,注意,我指的仅仅是我们这些普通企业网站,大企业例外啊,呵呵,为何?慢慢想想…… 经过我们多年的研究,一个结构合理