117 音乐的流媒体播放

来源:互联网 发布:交通可视化仿真软件 编辑:程序博客网 时间:2024/06/07 22:17

1.使用字系统自带类AVPlayer实现MP3
流媒体播放:

    NSURL *url = [NSURL URLWithString:@"http://192.168.1111.1111:8080/MJServer/resources/images/1.mp3"];    self.player = [[AVPlayer alloc] initWithURL:url];    [self.player play];

2.使用豆瓣框架播放:DOUAudioStreamer
github地址:https://github.com/douban/DOUAudioStreamer
下载之后将src文件夹拖进工程

1>编译报错:
报错

解决办法:
解决

2>第二个报错:
2

解决办法:
22
222
2222

之后在xcode7就可以编译成功!

DOUAudioStreamer的使用:
1>导入#import “DOUAudioStreamer.h”并生成一个属性

@property (nonatomic, strong) DOUAudioStreamer *streamer;

model类生成:
model

m1

m2

示例代码:

#pragma mark - 定时器- (void)addTimer{    self.currentTimeTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateCurrentTime) userInfo:nil repeats:YES];    [[NSRunLoop mainRunLoop] addTimer:self.currentTimeTimer forMode:NSRunLoopCommonModes];}- (void)removeTimer{    [self.currentTimeTimer invalidate];    self.currentTimeTimer = nil;}- (void)viewDidLoad{    [super viewDidLoad];    // 创建音频文件模型(提供音频文件路径)    // 创建播放器    self.streamer = [DOUAudioStreamer streamerWithAudioFile:[[DOUModel alloc] init]];    // KVO监听streamer的属性(Key value Observing)    [self.streamer addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionOld context:nil];    [self.streamer addObserver:self forKeyPath:@"bufferingRatio" options:NSKeyValueObservingOptionOld context:nil];    // 播放    [self.streamer play];    [self addTimer];}- (void)dealloc{    [self.streamer removeObserver:self forKeyPath:@"status"];    [self.streamer removeObserver:self forKeyPath:@"bufferingRatio"];}/** 利用KVO监听的属性值改变了,就会调用 */- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    dispatch_async(dispatch_get_main_queue(), ^{        if ([keyPath isEqualToString:@"status"]) { // 监听到播放器状态改变了            //            NSLog(@"状态改变了----%d", self.streamer.status);        } else if ([keyPath isEqualToString:@"bufferingRatio"]) { // 监听到缓冲比例改变            double unit = 1000.0;            // 总长度            double expectedLength = self.streamer.expectedLength / unit / unit;            // 已经下载长度            double receivedLength = self.streamer.receivedLength / unit / unit;            // 下载速度            double downloadSpeed = self.streamer.downloadSpeed / unit;            NSString *str = [NSString stringWithFormat:@"缓冲:%.2fMB/%.2fMB(%.0f%%)\n下载速度:%.2fKB/s", receivedLength, expectedLength, (receivedLength/ expectedLength) * 100, downloadSpeed];            NSLog(@"------rate-----%@",str);        }    });}- (void)updateCurrentTime{    //播放进度    double progress = self.streamer.currentTime / self.streamer.duration;    NSLog(@"progress:%f",progress);}

补充1:

@property (nonatomic, readonly) NSString *cachedPath;@property (nonatomic, readonly) NSURL *cachedURL;可以使用这两个属性将缓存的文件从temp转移到document中,相当于下载volumekey 设置声音

补充2:上一首,下一首

1>移除KVO(否则出错)[self.streamer removeObserver:self forKeyPath:@"status"];[self.streamer removeObserver:self forKeyPath:@"bufferingRatio"];2>置空self.streamer[self.streamer stop];self.streamer = nil;3>重新创建self.streamer并监听即可   // 创建音频文件模型(提供音频文件路径)    DOUModel *model = [[DOUModel alloc] init];    model.audioFileURL = [NSURL URLWithString:@"http://10.20.82.21:8080/MJServer/resources/images/1.mp3"];    // 创建播放器    self.streamer = [DOUAudioStreamer streamerWithAudioFile:model];4.因为model实现DOUAudioFile协议中的- (NSURL *)audioFileURL;方法,如果在这里返回url会播放固定的一首解决办法是:不实现协议方法,用属性来代替@property(nonatomic,strong)NSURL *audioFileURL;这个属性会默认生成- (NSURL *)audioFileURL;方法在model类创建之后立刻设置url,然后再将model给self.streamer使用,这样即可

音频总结:
一、音频播放
1.音效播放(短时间的音频文件)
1> AudioServicesCreateSystemSoundID
2> AudioServicesPlaySystemSound

2.音乐播放(长时间的音频文件)
1> AVAudioPlayer
只能播放本地的音频文件

2> AVPlayer
能播放本地、远程的音频、视频文件
基于Layer显示,得自己去编写控制面板

3> MPMoviePlayerController
能播放本地、远程的音频、视频文件
自带播放控制面板(暂停、播放、播放进度、是否要全屏)

4> MPMoviewPlayerViewController
能播放本地、远程的音频、视频文件
内部是封装了MPMoviePlayerController
播放界面默认就是全屏的
如果播放功能比较简单,仅仅是简单地播放远程、本地的视频文件,建议用这个

5> DOUAudioStreamer
能播放远程、本地的音频文件
监听缓冲进度、下载速度、下载进度

0 1