博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift - 制作一个录音机(声音的录制与播放)
阅读量:4306 次
发布时间:2019-06-06

本文共 3326 字,大约阅读时间需要 11 分钟。

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

转载于:https://www.cnblogs.com/Free-Thinker/p/4843382.html

你可能感兴趣的文章
Pull Request流程
查看>>
Lambda 表达式
查看>>
函数式数据处理(一)--流
查看>>
java 流使用
查看>>
java 用流收集数据
查看>>
java并行流
查看>>
CompletableFuture 组合式异步编程
查看>>
mysql查询某一个字段是否包含中文字符
查看>>
Java中equals和==的区别
查看>>
JVM内存管理及GC机制
查看>>
Java:按值传递还是按引用传递详细解说
查看>>
Java中Synchronized的用法
查看>>
阻塞队列
查看>>
linux的基础知识
查看>>
接口技术原理
查看>>
五大串口的基本原理
查看>>
PCB设计技巧与注意事项
查看>>
linux进程之间通讯常用信号
查看>>
main函数带参数
查看>>
PCB布线技巧
查看>>