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

本文介绍如何使用AVFoundation框架实现iOS平台上的录音应用。利用AVAudioRecorder进行录音,并通过AVAudioPlayer播放录制的声音文件。文中详细展示了如何设置录音参数、监测录音音量及管理录音文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,技术介绍
(1)AVFoundation.framework框架提供了AVAudioRecorder类。它可以实现录音功能。
(2)而使用该框架的AVAudioPlayer类,可以实现声音的播放。

2,下面制作一个录音机样例
(1)按住录音按钮则开始录音,松开则停止录音。录音文件保存在用户文件夹下。
(2)录音过程中会实时显示声音的音量大小(这个可以用来做声音脉冲图,获得更好的展示效果)
(3)点击播放录音则可播放录制的声音文件。

3,效果图如下:
原文:Swift - 制作一个录音机(声音的录制与播放)


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
import  UIKit
import  AVFoundation
 
class  ViewController UIViewController  {
     
     var  recorder: AVAudioRecorder //录音器
     var  player: AVAudioPlayer //播放器
     var  recorderSeetingsDic:[ String  AnyObject ]?  //录音器设置参数数组
     var  volumeTimer: NSTimer //定时器线程,循环监测录音的音量大小
     var  aacPath: String //录音存储路径
     
     @IBOutlet  weak  var  volumLab:  UILabel //显示录音音量
     
     override  func  viewDidLoad() {
         super .viewDidLoad()
         
         //初始化录音器
         let  session: AVAudioSession  AVAudioSession .sharedInstance()
     
         //设置录音类型
         try! session.setCategory( AVAudioSessionCategoryPlayAndRecord )
         //设置支持后台
         try! session.setActive( true )
         //获取Document目录
         let  docDir =  NSSearchPathForDirectoriesInDomains (. DocumentDirectory ,
             . UserDomainMask true )[0]
         //组合录音文件路径
         aacPath = docDir +  "/play.aac"
         //初始化字典并添加设置参数
         recorderSeetingsDic =
         [
             AVFormatIDKey NSNumber (unsignedInt: kAudioFormatMPEG4AAC),
             AVNumberOfChannelsKey : 2,  //录音的声道数,立体声为双声道
             AVEncoderAudioQualityKey  AVAudioQuality . Max .rawValue,
             AVEncoderBitRateKey  : 320000,
             AVSampleRateKey  : 44100.0  //录音器每秒采集的录音样本数
         ]
     }
     
     //按下录音
     @IBAction  func  downAction(sender:  AnyObject ) {
         //初始化录音器
         recorder = try!  AVAudioRecorder ( URL NSURL (string: aacPath!)!,
             settings: recorderSeetingsDic!)
         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 ) {
         //播放
         player = try!  AVAudioPlayer (contentsOfURL:  NSURL (string: aacPath!)!)
         if  player ==  nil  {
             print ( "播放失败" )
         } 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)"
     }
     
     override  func  didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
     }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值