国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

ios 流媒體播放器實現流程及FreeStreamer的使用的示例

2020-07-26 02:33:22
字體:
來源:轉載
供稿:網友

簡介

最近實現了一個流媒體播放器,使用的是FreeStreamer庫,至于為什么不用avaudioplayer或者avplayer,前一個是不能播放網絡音樂,后一個則是體驗不好,緩存不夠會暫停,然后又要手動播放。去github上搜了下,發現FreeStreamer評分比較高,于是就用它來實現了一個流媒體播放器。

演示效果

附上項目地址 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];// 到指定位置播放    }  }}

結語

以上就是實現流媒體音樂播放器的大概知識點,ui是自己自定義的(圖標素材主要源于網上),一些動畫的思路是用了某某云音后,然后根據自己掌握的一些知識來實現的。想看詳細實現流程和源碼的可以去我的項目地址查看。

戳這里 chenfengxiaoxixi

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 延寿县| 天祝| 密山市| 石门县| 衡东县| 寿宁县| 郓城县| 张家界市| 河曲县| 平和县| 武清区| 玛多县| 奉化市| 芜湖市| 定州市| 金华市| 禄丰县| 佛山市| 广灵县| 永善县| 常山县| 梧州市| 平顺县| 商丘市| 陕西省| 桃源县| 黎平县| 霸州市| 齐齐哈尔市| 建始县| 舟曲县| 龙岩市| 宜兴市| 师宗县| 金川县| 巢湖市| 类乌齐县| 瓦房店市| 江陵县| 南乐县| 宜宾县|