Swift - 制作一个录音机(声音的录制与播放)
一个 制作 swift 播放 声音 录制
2023-09-11 14:17:59 时间
1,技术介绍
(1)AVFoundation.framework框架提供了AVAudioRecorder类。它可以实现录音功能。
(2)而使用该框架的AVAudioPlayer类,可以实现声音的播放。
2,下面制作一个录音机样例
(1)按住录音按钮则开始录音,松开则停止录音。录音文件保存在用户文件夹下。
(2)录音过程中会实时显示声音的音量大小(这个可以用来做声音脉冲图,获得更好的展示效果)
(3)点击播放录音则可播放录制的声音文件。
3,效果图如下:
![](http://www.hangge.com/blog_uploads/201506/2015062410123814024.png)
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)" } } |
相关文章
- 当执行docker swarm join命令将一个节点加入swarm集群时,本质上都做了哪些事情?
- Loader Lock引起的一个Bug
- 39 制作一个显示隐藏的切换动画效果
- Google Earth Engine(GEE)——一个简单的单年逐日时间以sentinel-NO2为例,制作逐日时序图表
- 二维数组list,每行长度不同,寻找最窄区间[a,b],保证list每行至少有一个数在[a,b]上
- Android 面试——如何写一个又好又快的日志库?
- 使用EF Code First搭建一个简易ASP.NET MVC网站,允许数据库迁移
- 自己动手实现一个html2canvas
- String js删除字符串的最后一个字符三种方法
- 《JavaScript设计模式》——1.7 一个检测类
- 用 Swift 制作一个漂亮的汉堡按钮过渡动画
- 使用canvas制作一个移动端画板
- 制作一个类似苹果VFL的格式化语言来描述UIStackView
- python用thinker库制作一个进制转换器(可打包exe)
- 一个字符串是否在另外一个字符串数组里 Array.Exists 的用法 Array.IndexOf 用法
- 【手把手教你制作一个简易版的shell】
- ERP项目是一个改革企业管理模式的项目!
- Lua学习笔记之利用元表来制作一个只读的表
- S 权限 setuid 修改文件使文件在执行阶段具有所有的权限 T 是粘置位 创建一个目录用户可以在这个目录任意创建和修改文件 但是不能删除其他用户的文件 只能删除自己的文件
- 一个bug在redmine中的诞生到终结
- Java Secret: Using an enum to build a State machine(Java秘术:用枚举构建一个状态机)
- Linux——编写一个简单的服务器、客户端(使用TCP)——服务器一直监听本机的xxxx号端口,如果收到连接请求,将接收请求并接收客户端发来的消息;客户端与服务器端建立连接并发送一条消息。
- 开发一个微信小程序(2):编写博客园随笔列表
- 使用 os.startfile 打开某一个文件夹或者某一个文件
- 用Objective-C写了一个简单的批量更改文件名的程序
- JS:随机生成一段字符串;随机生成布尔值;在两个数字中生成一个随机数