iOS从零开始学习直播之音频2.后台播放和在线播放
本篇主要講音頻的后臺播放和在線播放。
后臺播放
??上一篇寫的工程運(yùn)行之后程序退至后臺,發(fā)現(xiàn)運(yùn)行不了,歌停止了,這顯然不行,音樂后臺播放是標(biāo)配啊。今天就來講一下后臺播放。
1.在plist文件里,告訴系統(tǒng)這是一款音樂軟件。
2.代碼里設(shè)置。這個(gè)方法最好在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions ;方法里調(diào)用,在別地調(diào)用也可以。
// 設(shè)置后臺播放 - (void)setBackGroudPlay {AVAudioSession *audioSession = [AVAudioSession sharedInstance];[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];[audioSession setActive:YES error:nil];}3.其實(shí)完成前兩步就可以實(shí)現(xiàn)后臺播放了,不過后臺播放最好加上一個(gè)過期時(shí)候的處理。
// 程序進(jìn)入后臺,執(zhí)行這個(gè)方法 - (void)applicationDidEnterBackground:(UIApplication *)application {UIBackgroundTaskIdentifier taskID = [application beginBackgroundTaskWithExpirationHandler:^{// 如果過期了,就停止任務(wù)[application endBackgroundTask:taskID];}]; }在線播放(AVPlayer)
&emps;&emps;如果一個(gè)播放器僅僅支持本地音頻播放顯然是不夠的,在線播放也是標(biāo)配啊。用AVAudioPlayer框架只能實(shí)現(xiàn)本地播放,想要實(shí)現(xiàn)在線播放得用AVPlayer框架。AVPlayer框架是用來播放視頻的,但是音頻也沒問題。
1.初識化UI
聲明的變量
&emps;&emps;黃色是UIProgressView,代表緩沖進(jìn)度條,藍(lán)色的是UISlider,代表播放控制條。
// (1)初始化二個(gè)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)初始化緩沖進(jìn)度條_progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(20, 59, ScreenWidth - 130 - 20, 5)];// 設(shè)置緩沖進(jìn)度條的顏色_progressView.progressTintColor = [UIColor yellowColor];[self.view addSubview:_progressView];// (3)初始化播放進(jìn)度_pregressSlider = [[UISlider alloc] initWithFrame:CGRectMake(20, 50, ScreenWidth - 130 - 20, 20)];_pregressSlider.minimumValue = 0.0f;_pregressSlider.maximumValue = 1.0f;// 把_pregressSlider小于滑塊的部分設(shè)置成藍(lán)色以顯示播放進(jìn)度_pregressSlider.minimumTrackTintColor = [UIColor blueColor];// 把_pregressSlider大于滑塊的部分設(shè)置成透明以顯示緩沖進(jìn)度_pregressSlider.maximumTrackTintColor = [UIColor clearColor];[_pregressSlider addTarget:self action:@selector(pregressChange) forControlEvents:UIControlEventValueChanged];[self.view addSubview: _pregressSlider];// (4)時(shí)間_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)播放進(jìn)度條要放在緩沖進(jìn)度條上面,否則緩沖進(jìn)度遮擋播放進(jìn)度。
(2)其他的和上一個(gè)工程一樣,就不介紹了。具體的可以去本人的GitUp上下載。
2.實(shí)現(xiàn)在線播放
準(zhǔn)備:在plist文件里讓工程支持http。
注意:必須等緩沖完了才能播放。
// 音頻控制 - (void)controlAVPlayerAction : (UIButton *)button {NSInteger tag = button.tag;// 播放if (tag == 100) {[self.avPlayer play];}// 暫停if (tag == 101) {[self.avPlayer pause];} }3.監(jiān)聽在線播放狀態(tài)
(1) 監(jiān)聽播放器狀態(tài)和緩沖狀態(tài)
// (5)監(jiān)聽播放器狀態(tài) NSKeyValueObservingOptionNew 把更改之前的值提供給處理方法[self.avPlayer.currentItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];// (6)監(jiān)聽緩存狀態(tài)[self.avPlayer.currentItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];備注:監(jiān)聽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:未知狀態(tài),此時(shí)不能播放");break;case AVPlayerStatusReadyToPlay:NSLog(@"KVO:準(zhǔn)備完畢,可以播放");break;case AVPlayerStatusFailed:NSLog(@"KVO:加載失敗,網(wǎng)絡(luò)或者服務(wù)器出現(xiàn)問題");break;default:break;}}if ([keyPath isEqualToString:@"loadedTimeRanges"]) {NSArray * timeRanges = self.avPlayer.currentItem.loadedTimeRanges;//本次緩沖的時(shí)間范圍CMTimeRange timeRange = [timeRanges.firstObject CMTimeRangeValue];//緩沖總長度NSTimeInterval totalLoadTime = CMTimeGetSeconds(timeRange.start) + CMTimeGetSeconds(timeRange.duration);//音樂的總時(shí)間NSTimeInterval duration = CMTimeGetSeconds(self.avPlayer.currentItem.duration);//計(jì)算緩沖百分比例NSTimeInterval scale = totalLoadTime/duration;//更新緩沖進(jìn)度條_progressView.progress = scale;} }注意:status是檢測的硬件屬性,也就是用戶的手機(jī)。只要手機(jī)沒壞都能準(zhǔn)備完成.但是準(zhǔn)備完成還不能播放,得能緩沖完。
(2)監(jiān)聽音樂播放的進(jìn)度
注意:block里面一定要防止循環(huán)引用。
(3)監(jiān)聽音樂播放完成
注意:播放完成如果你什么都不設(shè)置,就會變成停止播放。AVPlayer沒有播放次數(shù)的屬性,得我們自己實(shí)現(xiàn)。
3.最后
注意:如果不移除觀察者,將造成內(nèi)存泄漏。
??要想獲得完整工程可以去本人的GitUp上下載。
轉(zhuǎn)載于:https://www.cnblogs.com/doujiangyoutiao/p/6105316.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的iOS从零开始学习直播之音频2.后台播放和在线播放的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java8入门 错误:找不到或者无法加载
- 下一篇: [原创] Easy SysLite V1