本地音乐
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()<AVAudioPlayerDelegate>
@property (nonatomic, strong) AVAudioPlayer *audioPlayer;
@end
@implementation ViewController
#pragma mark -懒加载
-(AVAudioPlayer *)audioPlayer
{
if (!_audioPlayer) {
// 0. 设置后台音频会话
[self setBackGroundPlay];
// 1. 获取资源URL
NSURL *url = [[NSBundle mainBundle] URLForResource:@"简单爱.mp3" withExtension:nil];
// 2. 根据资源URL, 创建 AVAudioPlayer 对象
_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
// 2.1 设置允许倍速播放
self.audioPlayer.enableRate = YES;
// 3. 准备播放
[_audioPlayer prepareToPlay];
// 4. 设置代理, 监听播放事件
_audioPlayer.delegate = self;
}
return _audioPlayer;
}
- (void)setBackGroundPlay
{
// 1. 设置会话模式
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; ;
// 2. 激活会话
[[AVAudioSession sharedInstance] setActive:YES error:nil];
}
// 开始播放
- (IBAction)beginPlay {
[self.audioPlayer play];
}
// 暂停
- (IBAction)pause {
[self.audioPlayer pause];
}
// 停止
- (IBAction)stop {
// 停止某个音乐, 并不会重置播放时间, 下次再播放, 会从当前位置开始播放
[self.audioPlayer stop];
// 重置当前播放时间
self.audioPlayer.currentTime = 0;
// 或者直接清空重新创建
// self.audioPlayer = nil;
}
// 快进5秒
- (IBAction)fastForward {
// 系统已经对currentTime, 做了容错处理, 不用担心时间为负数或者大于音乐总时长
self.audioPlayer.currentTime += 5;
}
// 快退5秒
- (IBAction)rewind {
self.audioPlayer.currentTime -= 5;
}
// 2倍速播放
- (IBAction)doubleRate {
// 1.0 为正常
// 设置允许调整播放速率, 注意, 此方法必须设置在准备播放之前(经测试, 在播放前也可以)
// self.audioPlayer.enableRate = YES;
self.audioPlayer.rate = 2.0;
}
// 音量调节
- (IBAction)volumeChange:(UISlider *)sender {
// 0.0 --- 1.0
self.audioPlayer.volume = sender.value;
}
#pragma mark - 播放器代理
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
NSLog(@"播放完成");
}
远程音乐
其他方法参考本地音乐
// 通过一个播放项进行创建, 如果想要更换歌曲, 直接更换播放项就可以, 不需要重新创建
- (void)fangan2
{
NSURL *remoteURL = [NSURL URLWithString:@"http://music.163.com/song/media/outer/url?id=25906124.mp3"];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:remoteURL];
self.player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
[self.player play];
// 可以通过这个方法, 直接替换URL
// self.player replaceCurrentItemWithPlayerItem:<#(nullable AVPlayerItem *)#>
}