iOS从零开始学习直播之音频2.后台播放和在线播放
本篇主要讲音频的后台播放和在线播放。
后台播放
上一篇写的工程运行之后程序退至后台,发现运行不了,歌停止了,这显然不行,音乐后台播放是标配啊。今天就来讲一下后台播放。
1.在plist文件里,告诉系统这是一款音乐软件。
2.代码里设置。这个方法最好在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions ;方法里调用,在别地调用也可以。
// 设置后台播放 - (void)setBackGroudPlay {AVAudioSession *audioSession = [AVAudioSession sharedInstance];[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];[audioSession setActive:YES error:nil];}3.其实完成前两步就可以实现后台播放了,不过后台播放最好加上一个过期时候的处理。
// 程序进入后台,执行这个方法 - (void)applicationDidEnterBackground:(UIApplication *)application {UIBackgroundTaskIdentifier taskID = [application beginBackgroundTaskWithExpirationHandler:^{// 如果过期了,就停止任务[application endBackgroundTask:taskID];}]; }在线播放(AVPlayer)
&emps;&emps;如果一个播放器仅仅支持本地音频播放显然是不够的,在线播放也是标配啊。用AVAudioPlayer框架只能实现本地播放,想要实现在线播放得用AVPlayer框架。AVPlayer框架是用来播放视频的,但是音频也没问题。
1.初识化UI
声明的变量
&emps;&emps;黄色是UIProgressView,代表缓冲进度条,蓝色的是UISlider,代表播放控制条。
// (1)初始化二个Button;NSArray *titleArr = @[@"播放",@"暂停"];for (int i = 0; i < titleArr.count; i++ ) {UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];[self.view addSubview:button];[button setFrame:CGRectMake(20 + i * 50, 130 , 60, 40)];[button setTitle:titleArr[i] forState:UIControlStateNormal];button.tag = i+100;[button addTarget:self action:@selector(controlAVPlayerAction:) forControlEvents:UIControlEventTouchUpInside];}// (2)初始化缓冲进度条_progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(20, 59, ScreenWidth - 130 - 20, 5)];// 设置缓冲进度条的颜色_progressView.progressTintColor = [UIColor yellowColor];[self.view addSubview:_progressView];// (3)初始化播放进度_pregressSlider = [[UISlider alloc] initWithFrame:CGRectMake(20, 50, ScreenWidth - 130 - 20, 20)];_pregressSlider.minimumValue = 0.0f;_pregressSlider.maximumValue = 1.0f;// 把_pregressSlider小于滑块的部分设置成蓝色以显示播放进度_pregressSlider.minimumTrackTintColor = [UIColor blueColor];// 把_pregressSlider大于滑块的部分设置成透明以显示缓冲进度_pregressSlider.maximumTrackTintColor = [UIColor clearColor];[_pregressSlider addTarget:self action:@selector(pregressChange) forControlEvents:UIControlEventValueChanged];[self.view addSubview: _pregressSlider];// (4)时间_pregressLabel = [[UILabel alloc] initWithFrame:CGRectMake(ScreenWidth - 120, 50, 100, 20)];_pregressLabel.text = @"00:00/00:00";[self.view addSubview:_pregressLabel];// (5)初始化音量_volumeSlider = [[UISlider alloc] initWithFrame:CGRectMake(20, 90, ScreenWidth - 130 - 20, 20)];[_volumeSlider addTarget:self action:@selector(volumeChange) forControlEvents:UIControlEventValueChanged];_volumeSlider.minimumValue = 0.0f;_volumeSlider.maximumValue = 10.0f;_volumeSlider.value = 1.0f;[self.view addSubview:_volumeSlider];UILabel *volumeLabel = [[UILabel alloc] initWithFrame:CGRectMake(ScreenWidth - 120, 90, 40, 20)];volumeLabel.text = @"音量";[self.view addSubview:volumeLabel];注意:(1)播放进度条要放在缓冲进度条上面,否则缓冲进度遮挡播放进度。
(2)其他的和上一个工程一样,就不介绍了。具体的可以去本人的GitUp上下载。
2.实现在线播放
准备:在plist文件里让工程支持http。
注意:必须等缓冲完了才能播放。
// 音频控制 - (void)controlAVPlayerAction : (UIButton *)button {NSInteger tag = button.tag;// 播放if (tag == 100) {[self.avPlayer play];}// 暂停if (tag == 101) {[self.avPlayer pause];} }3.监听在线播放状态
(1) 监听播放器状态和缓冲状态
// (5)监听播放器状态 NSKeyValueObservingOptionNew 把更改之前的值提供给处理方法[self.avPlayer.currentItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];// (6)监听缓存状态[self.avPlayer.currentItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];备注:监听self.avPlayer.currentItem的status和loadedTimeRanges属性,一有变化就把更改之前的值提供给下面的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context {if ([keyPath isEqualToString:@"status"]) {switch (_avPlayer.status) {case AVPlayerStatusUnknown:NSLog(@"KVO:未知状态,此时不能播放");break;case AVPlayerStatusReadyToPlay:NSLog(@"KVO:准备完毕,可以播放");break;case AVPlayerStatusFailed:NSLog(@"KVO:加载失败,网络或者服务器出现问题");break;default:break;}}if ([keyPath isEqualToString:@"loadedTimeRanges"]) {NSArray * timeRanges = self.avPlayer.currentItem.loadedTimeRanges;//本次缓冲的时间范围CMTimeRange timeRange = [timeRanges.firstObject CMTimeRangeValue];//缓冲总长度NSTimeInterval totalLoadTime = CMTimeGetSeconds(timeRange.start) + CMTimeGetSeconds(timeRange.duration);//音乐的总时间NSTimeInterval duration = CMTimeGetSeconds(self.avPlayer.currentItem.duration);//计算缓冲百分比例NSTimeInterval scale = totalLoadTime/duration;//更新缓冲进度条_progressView.progress = scale;} }注意:status是检测的硬件属性,也就是用户的手机。只要手机没坏都能准备完成.但是准备完成还不能播放,得能缓冲完。
(2)监听音乐播放的进度
注意:block里面一定要防止循环引用。
(3)监听音乐播放完成
注意:播放完成如果你什么都不设置,就会变成停止播放。AVPlayer没有播放次数的属性,得我们自己实现。
3.最后
注意:如果不移除观察者,将造成内存泄漏。
要想获得完整工程可以去本人的GitUp上下载。
转载于:https://www.cnblogs.com/doujiangyoutiao/p/6105316.html
《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读总结
以上是生活随笔为你收集整理的iOS从零开始学习直播之音频2.后台播放和在线播放的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: java8入门 错误:找不到或者无法加载
- 下一篇: Struts2自定义类型转换器、自定义拦