iOS--播放声音(AVAudioPlayer)、录音(AVAudioRecorder)

播放音频

 

首先在导入框架:

#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

 第二个界面:录音

界面:

iOS--播放声音(AVAudioPlayer)、录音(AVAudioRecorder)_第1张图片

代码:

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

你可能感兴趣的:(iOS--播放声音(AVAudioPlayer)、录音(AVAudioRecorder))