您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“ios如何實現流媒體播放器”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“ios如何實現流媒體播放器”這篇文章吧。
演示效果
附上項目地址 chenfengxiaoxixi
實現功能
實現了流媒體音樂播放,后臺持續播放,歌曲切換,進度條顯示以及快進后退等功能。
實現技術點及流程
1.單例
播放器所在controller我是使用單例初始化的,不然pop到上一級控制器后,當前對象釋放掉,就無法播放了
+ (instancetype)sharePlayerController { @synchronized(self) { static CFPlayerController *_instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance; } }
這里使用了線程同步,避免由卡頓造成的多次初始化。
2.后臺持續播放
先在xcode配置里面(TARGETS->Capabilities)打開Background Modes,勾選上Audio那一欄。現在只是滿足了后臺播放條件,要想連續不斷在后臺播放,還要申請后臺任務id。
//添加后臺播放任務 UIBackgroundTaskIdentifier bgTask = 0; if([UIApplication sharedApplication].applicationState== UIApplicationStateBackground) { NSLog(@"后臺播放"); UIApplication*app = [UIApplication sharedApplication]; UIBackgroundTaskIdentifier newTask = [app beginBackgroundTaskWithExpirationHandler:nil]; if(bgTask!= UIBackgroundTaskInvalid) { [app endBackgroundTask: bgTask]; } bgTask = newTask; [self next]; } else { NSLog(@"前臺播放"); [self.cdView scrollRightWIthNext]; }
播放完成一首歌后,這段代碼用來判斷當前處于前臺還是后臺,如果是后臺,那就申請后臺任務繼續播放下一首。
3.鎖屏后對音樂播放的操作及信息顯示
需要重寫remoteControlReceivedWithEvent,用來獲取鎖屏后對播放器的操作
- (void)remoteControlReceivedWithEvent: (UIEvent *) receivedEvent { [CF_NOTI_CENTER postNotificationName:@"remoteControl" object:nil userInfo:@{@"event":receivedEvent}]; }
該通知發送到播放控制器,在播放控制器實現處理邏輯
- (void)remoteControl:(NSNotification *)note { UIEvent *receivedEvent = note.userInfo[@"event"]; if (receivedEvent.type == UIEventTypeRemoteControl) { switch (receivedEvent.subtype) { case UIEventSubtypeRemoteControlTogglePlayPause: [self.audioStream stop]; break; case UIEventSubtypeRemoteControlPreviousTrack: [self.cdView scrollLeftWithPrev]; break; case UIEventSubtypeRemoteControlNextTrack: [self.cdView scrollRightWIthNext]; break; case UIEventSubtypeRemoteControlPlay: [self.cdView playOrPause]; break; case UIEventSubtypeRemoteControlPause: //暫停歌曲時,動畫也要暫停 [self.cdView playOrPause]; break; default: break; } } }
更新鎖屏后音樂的顯示信息
//鎖屏顯示信息 - (void)configNowPlayingInfoCenter { if (NSClassFromString(@"MPNowPlayingInfoCenter")) { NSMutableDictionary * dict = [[NSMutableDictionary alloc] init]; [dict setObject:CFUSER.currentSong.songName forKey:MPMediaItemPropertyTitle]; [dict setObject:@(self.playTime)forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime]; //音樂的總時間 [dict setObject:@(self.totalTime)forKey:MPMediaItemPropertyPlaybackDuration]; [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:dict]; } }
4.關于FreeStreamer的使用
初始化,開始播放
- (void)buildStreamer { weakSELF; // 網絡文件 NSURL *url = [NSURL URLWithString:CFUSER.currentSong.url]; if (!_audioStream) { _audioStream = [[FSAudioStream alloc] initWithUrl:url]; _audioStream.onFailure = ^(FSAudioStreamError error,NSString *description){ NSLog(@"播放過程中發生錯誤,錯誤信息:%@",description); [weakSelf showAlertMsg:description]; }; _audioStream.onCompletion=^(){ //播放完成后,執行下一步 [weakSelf autoPlayNext]; }; // 設置聲音 [_audioStream setVolume:1]; //開始播放 [_audioStream play]; } else { _audioStream.url = url; [_audioStream play]; } }
停止播放
[self.audioStream stop];
暫停播放和繼續播放為同一個方法,別問為什么,作者就是這樣寫的
[self.audioStream pause];
快進后退播放
- (void)dragSliderEnd:(UISlider *)slider{ //滑動到底時,播放下一曲 if (slider.value == 1) { [self.cdView scrollRightWIthNext]; } else { if (slider.value > 0) { //初始化一個FSStreamPosition結構體 FSStreamPosition pos; //只對position賦值,value由slider控制 pos.position = slider.value; [self.audioStream seekToPosition:pos];// 到指定位置播放 } } }
以上是“ios如何實現流媒體播放器”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。