AVAudioPlayer在AVFoundation框架下,所以我们要导入AVFoundation.framework。
AVAudioPlayer类封装了播放单个声音的能力。播放器可以用NSURL或者NSData来初始化,要注意的是NSURL并不可以是网络url而必须是本地文件URL,
因为 AVAudioPlayer不具备播放网络音频的能力,如果要播放网络URL,需要先转化为NSData.但是此法并不可取,
因为AVAudioPlayer只能播放一个完整的文件,并不支持流式播放,所以必须是缓冲完才能播放,所以如果网络文件过大抑或是网速不够岂不是要等很久?
所以播放网络音频我们一般用音频队列。
注意:需要添加AVFoundation.framework
AVAudioPlayer不支持边下边播,所以只能下载到本地再播放
1.实例化方法
- (instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError;
2.预加载资源
- (BOOL)prepareToPlay;
3.遵守协议
AVAudioPlayerDelegate
4.播放完成之后回调以下方法
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
先搭建UI吧,直接上图:
#import "AVAudioPlayerViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface AVAudioPlayerViewController ()
{
//声明一个播放器
AVAudioPlayer *_musicPlay;//音乐播放器
}
- (IBAction)playAction:(id)sender;//播放
- (IBAction)pauseAction:(id)sender;//暂停
- (IBAction)voiceAction:(UISlider *)sender;//音量
- (IBAction)progressAction:(UISlider *)sender;//进度
@property (weak, nonatomic) IBOutlet UISlider *progressSlider;//进度条
@property (nonatomic,strong)NSTimer *myTimer;//声明一个定时器类型的成员变量
@end
@implementation AVAudioPlayerViewController
- (void)viewDidLoad {
[super viewDidLoad];
//获取资源路径 需要事先导入本地音频内容
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"mp3"];
NSLog(@"%@",filePath);
NSURL *URL =[NSURL fileURLWithPath:filePath];
_musicPlay = [[AVAudioPlayer alloc] initWithContentsOfURL:URL error:nil];
//实例化音乐播放器
// _musicPlay = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath] error:nil];
//设置音量大小处于中等强度
_musicPlay.volume = 0.5;
//循环次数,默认是1
_musicPlay.numberOfLoops = 1;
// 声道数
NSUInteger channels = _musicPlay.numberOfChannels;//只读属性
//预加载资源
if ([_musicPlay prepareToPlay]) {
NSLog(@"准备完毕");
}
//设置总进度大小
self.progressSlider.maximumValue = _musicPlay.duration;
}
#pragma mark- 各类触发事件
-(void)change:(NSTimer *)sender{
//每一秒钟设置一下进度值 播放位置
self.progressSlider.value = _musicPlay.currentTime;
}
#pragma mark- AVAudioPlayer相关的方法
- (IBAction)playAction:(id)sender {
//播放
[_musicPlay play];
self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(change:) userInfo:nil repeats:YES];
}
- (IBAction)pauseAction:(id)sender {
//暂停
[_musicPlay pause];
//停止定时器
[self.myTimer invalidate];
NSLog(@"%f",_musicPlay.currentTime);
}
- (IBAction)voiceAction:(UISlider *)sender {
//改变音量大小
_musicPlay.volume = sender.value;
}
- (IBAction)progressAction:(UISlider *)sender {
//设置进度
_musicPlay.currentTime = sender.value;
}
代理方法
加入播放出现异常,或者被更高级别的系统任务打断,我们的程序还没来得及收场就挂了,怎么办?不急,我们可以通过几个委托方法很好地处理所有的情形。
首先给player设置委托是必须的:
- player.delegate = self;
- - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer*)player successfully:(BOOL)flag{
- //播放结束时执行的动作
- }
- - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer*)player error:(NSError *)error{
- //解码错误执行的动作
- }
- - (void)audioPlayerBeginInteruption:(AVAudioPlayer*)player{
- //处理中断的代码
- }
- - (void)audioPlayerEndInteruption:(AVAudioPlayer*)player{
- //处理中断结束的代码
- }
如果对你有帮助,请关注我哦!