- AVAudioPlayer :播放音乐, 只能播放本地
- AVPlayer :播放音乐 ,本地、远程通吃, 并且还可以播放视频
- MPMoviePlayerController: 播放音乐,本地、远程通吃, 并且还可以播放视频
- MPMoviePlayerViewController:播放音乐,本地、远程通吃, 并且还可以播放视频
一、AVAudioPlayer
1.导入头文件
#import <AVFoundation/AVFoundation.h>
2.播放音乐
- (IBAction)play {
if (![self.player isPlaying]) {
[self.player play];
}
// 创建播放器
NSURL*url = [[NSBundle mainBundle] URLForResource:@"一东.mp3"withExtension:nil];
AVAudioPlayer*player = [[AVAudioPlayeralloc] initWithContentsOfURL:url error:nil];
// 是否允许快进
player.enableRate = YES;
// 快进速度
player.rate = 3;
self.player = player;
// 准备播放
if ([player prepareToPlay]) {
// 播放音乐
[player play];
}
}
- (IBAction)pause {
[self.player pause];
}
- (IBAction)stop {
[self.player stop];
// 停止播放后从内存清空
self.player =nil;
}
二、AVPlayer(本地音乐/在线音乐)
- 本地音乐
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()
/**
* 播放器
*/
@property (nonatomic, strong) AVPlayer *player;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 初始化播放器
NSURL*url = [[NSBundlemainBundle] URLForResource:@"Background.caf"withExtension:nil];
self.player = [AVPlayer playerWithURL:url];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.player play];
}
@end
2.在线音乐:
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()
/**
* 播放器
*/
@property (nonatomic, strong) AVPlayer *player;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 初始化播放器
NSURL*url = [NSURLURLWithString:@"http://y1.eoews.com/assets/ringtones/2012/5/18/34049/oiuxsvnbtxks7a0tg6xpdo66exdhi8h0bplp7twp.mp3"];
self.player = [AVPlayer playerWithURL:url];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.player play];
}
@end
注意:
AVPlayer不能获得播放进度,想要获取在线音乐下载进度等信息,需要第三方框架。
三、第三方框架播放流媒体(在线)音乐(DOUAudioStreamer)
苹果自带的AVPlayer和MPMoviePlayerController能播放流媒体音频, 但是提供的功能接口较少, 无法实现过于复杂和个性化的功能。如果想实现一些个性化\复杂的操作, 可以借助一些第三方框架轻易实现。
DOUAudioStreamer : 豆瓣出品
https://github.com/douban/DOUAudioStreamerStreamingKit
https://github.com/tumtumtum/StreamingKitFreeStreamer
https://github.com/muhku/FreeStreamer
下面介绍DOUAudioStreamer的使用
导入src文件夹下面的所有源代码
导入依赖的框架
-
包含主头文件
#import "DOUAudioStreamer.h"
4.新建一个遵守协议的模型类,用于提供音频文件的远程路径
#import "DOUAudioStreamer.h"
@interface CJAudioFile : NSObject<DOUAudioFile>
/**
* 音频文件路径
*/
@property(strong, nonatomic) NSURL*audioFileURL;
@end
5.DOUAudioStreamer类常见属性
// 文件的总大小
@property (nonatomic, readonly) NSUIntegerexpectedLength;
// 目前已下载的文件大小
@property (nonatomic, readonly) NSUIntegerreceivedLength;
// 下载速度
@property (nonatomic, readonly) NSUIntegerdownloadSpeed;
// 缓冲比例
@property (nonatomic, assign, readonly) doublebufferingRatio;
// 音量
@property (nonatomic, assign) doublevolume;
// 缓存路径(在沙盒的tmp目录, 随时会被删除)
@property (nonatomic, readonly) NSString*cachedPath;
// 歌曲的总时长
@property (nonatomic, assign, readonly) NSTimeIntervalduration;
// 歌曲的当前播放时长
@property (nonatomic, assign) NSTimeIntervalcurrentTime;
// 播放器状态
@property (assign, readonly) DOUAudioStreamerStatusstatus;
7.播放器状态
typedefNS_ENUM(NSUInteger, DOUAudioStreamerStatus) {
DOUAudioStreamerPlaying, // 正在播放
DOUAudioStreamerPaused, // 暂停
DOUAudioStreamerIdle, // 停止播放
DOUAudioStreamerFinished, // 播放完毕
DOUAudioStreamerBuffering, // 正在缓冲
DOUAudioStreamerError // 播放错误
};
8.传入模型,开始播放音乐
self.audioStreamer=[DOUAudioStreamerstreamerWithAudioFile:file];
[self.audioStreamer play];
9.可以通过KVO监听播放器的状态
[self.audioStreamer addObserver:self forKeyPath:CJStatusProp options:NSKeyValueObservingOptionNewcontext:nil];
[self.audioStreamer addObserver:self forKeyPath:CJDurationProp options:NSKeyValueObservingOptionNewcontext:nil];
[self.audioStreamer addObserver:self forKeyPath:CJBufferingRatioProp options:NSKeyValueObservingOptionNewcontext:nil];
10.暂停\停止播放
[self.audioStreamer pause];
[self.audioStreamer stop];
11.移除KVO监听
[self.audioStreamer removeObserver:self forKeyPath:CJStatusProp];
[self.audioStreamer removeObserver:self forKeyPath:CJDurationProp];
[self.audioStreamer removeObserver:self forKeyPath:CJBufferingRatioProp];