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入门 错误:找不到或者无法加载
- 下一篇: [原创] Easy SysLite V1