播放音频:
首先在导入框架:
#import <AVFoundation/AVFoundation.h>
//01 加载音频路径
NSString *str=[[NSBundle mainBundle] pathForResource:@"半点心_草蜢" ofType:@"mp3"];
NSURL *musicUrl=[NSURL fileURLWithPath:str];
//02 创建AVAudioPlayer的对象
AVAudioPlayer* _player=[[AVAudioPlayer alloc] initWithContentsOfURL:musicUrl error:nil];
//03 准备播放
//因为有些音频可能过大,一次性加载到内存可能会耗时过长,所以先使用准备播放,就是提前加载音频到内存中
[_player prepareToPlay];
//开始播放
[_player play];
//暂停播放
[_player pause];
录音:
首先在导入框架:
#import <AVFoundation/AVFoundation.h>
//01 创建录音保存路径
//保存到沙盒路径下
NSString* path = [NSString stringWithFormat:@"%@/Documents/luyin", NSHomeDirectory()];
NSURL* url = [NSURL fileURLWithPath:path];
// 02 对录音进行设置
以/*******————*****/开始,到/*******————*****/结束之间的代码可以完全一样,因为录音设置的对象太多了,以下设置方式,已经可以实现大多数的录音效果了,所以推荐没有特殊情况,不要修改,直接复制即可
/*******————*****/
//录音设置
NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc]init];
//设置录音格式 AVFormatIDKey==kAudioFormatLinearPCM
[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
//设置录音采样率(Hz) 如:AVSampleRateKey==8000/44100/96000(影响音频的质量)
[recordSetting setValue:[NSNumber numberWithFloat:44100] forKey:AVSampleRateKey];
//录音通道数 1 或 2
[recordSetting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
//线性采样位数 8、16、24、32
[recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
//录音的质量
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];
/*******————*****/
//03 创建AVAudioRecorder对象
//初始化录音
AVAudioRecorder* _recorder = [[AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:nil];
//04 准备录音
//准备录音
[_recorder prepareToRecord];
//开始录音
[_recorder record];
//停止录音
[_recorder stop];
完整代码工程:
第一个界面:播放音频
sstoryboard截图:
对应代码:
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
#import "AZViewController.h"
#import <AVFoundation/AVFoundation.h>
#import "AZSecondViewController.h"
@interface
AZViewController ()
{
AVAudioPlayer *_player;
NSTimer
*_timer;
}
@property
(weak,
nonatomic
)
IBOutlet
UISlider *proSlider;
@property
(weak,
nonatomic
)
IBOutlet
UISlider *voiceSlider;
@property
(weak,
nonatomic
)
IBOutlet
UISlider *panSlider;
@property
(weak,
nonatomic
)
IBOutlet
UISlider *speedSlider;
@property
(weak,
nonatomic
)
IBOutlet
UIProgressView *pv2;
@property
(weak,
nonatomic
)
IBOutlet
UIProgressView *pv1;
- (
IBAction
)play:(
id
)sender;
- (
IBAction
)puse:(
id
)sender;
- (
IBAction
)next:(
id
)sender;
@end
@implementation
AZViewController
- (
void
)viewDidLoad
{
[
super
viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self
.navigationItem.title=@
"播放声音"
;
NSString
*str=[[
NSBundle
mainBundle] pathForResource:@
"半点心_草蜢"
ofType:@
"mp3"
];
NSURL
*musicUrl=[
NSURL
fileURLWithPath:str];
_player=[[AVAudioPlayer alloc] initWithContentsOfURL:musicUrl error:
nil
];
//准备播放
[_player prepareToPlay];
//开启变速
[_player setEnableRate:
YES
];
//开启峰值
_player.meteringEnabled=
YES
;
[
self
.proSlider addTarget:
self
action:
@selector
(setProcess) forControlEvents:UIControlEventValueChanged];
[
self
.voiceSlider addTarget:
self
action:
@selector
(changeVoice) forControlEvents:UIControlEventValueChanged];
[
self
.panSlider addTarget:
self
action:
@selector
(changePan) forControlEvents:UIControlEventValueChanged];
[
self
.speedSlider addTarget:
self
action:
@selector
(changeSpeed) forControlEvents:UIControlEventValueChanged];
}
-(
void
)setProcess
{
//设置进度
_player.currentTime=_player.duration*
self
.proSlider.value;
}
-(
void
)changeVoice
{
//设置声音
_player.volume=
self
.voiceSlider.value;
}
-(
void
)changePan
{
_player.pan=
self
.panSlider.value;
}
-(
void
)changeSpeed
{
//设置播放速度
_player.rate=
self
.speedSlider.value;
}
- (
void
)didReceiveMemoryWarning
{
[
super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (
IBAction
)play:(
id
)sender
{
//开始播放
[_player play];
if
(!_timer) {
_timer=[
NSTimer
scheduledTimerWithTimeInterval:0.1 target:
self
selector:
@selector
(timeCome) userInfo:
nil
repeats:
YES
];
}
[_timer setFireDate:[
NSDate
distantPast]];
}
-(
void
)timeCome
{
//进度=当前时间/总时间
float
pro=_player.currentTime/_player.duration;
[
self
.proSlider setValue:pro animated:
YES
];
//刷新峰值
[_player updateMeters];
//最大峰值
float
peakValue=[_player peakPowerForChannel:0];
//平均值
float
avgValue=[_player averagePowerForChannel:0];
//打印查看该音乐的最大峰值,和平均峰值的范围
// NSLog(@"%f--%f",peakValue,avgValue);
//该音乐一般为 -20,有的音乐可能不同
[_pv1 setProgress:(peakValue+20)/20 animated:
YES
];
[_pv2 setProgress:(avgValue+20)/20 animated:
YES
];
}
- (
IBAction
)puse:(
id
)sender
{
//暂停播放
[_player pause];
//暂停定时器
[_timer setFireDate:[
NSDate
distantFuture]];
}
- (
IBAction
)next:(
id
)sender
{
AZSecondViewController *secondVC=[[AZSecondViewController alloc] init];
[
self
.navigationController pushViewController:secondVC animated:
YES
];
}
@end
|
第二个界面:录音
界面:
代码:
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
|
#import "AZSecondViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface
AZSecondViewController ()
{
UIButton *_button;
AVAudioPlayer* _player;
AVAudioRecorder* _recorder;
}
@end
@implementation
AZSecondViewController
- (
id
)initWithNibName:(
NSString
*)nibNameOrNil bundle:(
NSBundle
*)nibBundleOrNil
{
self
= [
super
initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if
(
self
) {
// Custom initialization
}
return
self
;
}
- (
void
)viewDidLoad
{
[
super
viewDidLoad];
// Do any additional setup after loading the view.
self
.view.backgroundColor=[UIColor whiteColor];
self
.navigationItem.title=@
"录音"
;
_button=[UIButton buttonWithType:UIButtonTypeCustom];
_button.frame=CGRectMake(100, 100, 100, 20);
[_button setTitle:@
"开始录音"
forState:UIControlStateNormal];
[_button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[_button addTarget:
self
action:
@selector
(startRecond) forControlEvents:UIControlEventTouchDown];
//按下开始响应事件
[_button addTarget:
self
action:
@selector
(stopRecond) forControlEvents:UIControlEventTouchUpInside];
//松开的响应事件
[
self
.view addSubview:_button];
//保存到沙盒路径下
NSString
* path = [
NSString
stringWithFormat:@
"%@/Documents/luyin"
,
NSHomeDirectory
()];
NSURL
* url = [
NSURL
fileURLWithPath:path];
//录音设置
NSMutableDictionary
*recordSetting = [[
NSMutableDictionary
alloc]init];
//设置录音格式 AVFormatIDKey==kAudioFormatLinearPCM
[recordSetting setValue:[
NSNumber
numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
//设置录音采样率(Hz) 如:AVSampleRateKey==8000/44100/96000(影响音频的质量)
[recordSetting setValue:[
NSNumber
numberWithFloat:44100] forKey:AVSampleRateKey];
//录音通道数 1 或 2
[recordSetting setValue:[
NSNumber
numberWithInt:1] forKey:AVNumberOfChannelsKey];
//线性采样位数 8、16、24、32
[recordSetting setValue:[
NSNumber
numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
//录音的质量
[recordSetting setValue:[
NSNumber
numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];
//初始化录音
_recorder = [[AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:
nil
];
//准备录音
[_recorder prepareToRecord];
//[_recorder setMeteringEnabled:YES];
}
-(
void
)startRecond
{
[_button setTitle:@
"录音中...."
forState:UIControlStateNormal];
[_recorder record];
}
-(
void
)stopRecond
{
[_button setTitle:@
"开始录音"
forState:UIControlStateNormal];
[_recorder stop];
NSString
* path = [
NSString
stringWithFormat:@
"%@/Documents/luyin"
,
NSHomeDirectory
()];
NSURL
* url = [
NSURL
fileURLWithPath:path];
_player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:
nil
];
[_player prepareToPlay];
[_player play];
}
- (
void
)didReceiveMemoryWarning
{
[
super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
|