91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ios如何實現流媒體播放器

發布時間:2021-07-26 13:52:14 來源:億速云 閱讀:173 作者:小新 欄目:移動開發

這篇文章主要為大家展示了“ios如何實現流媒體播放器”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“ios如何實現流媒體播放器”這篇文章吧。

演示效果

ios如何實現流媒體播放器

ios如何實現流媒體播放器

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如何實現流媒體播放器”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

洛川县| 拜城县| 枣阳市| 蓬莱市| 平顶山市| 石门县| 凤山县| 梁平县| 茂名市| 旌德县| 邢台县| 甘洛县| 永和县| 安顺市| 邯郸县| 龙州县| 班玛县| 武平县| 江门市| 博乐市| 多伦县| 襄城县| 陇南市| 军事| 伊吾县| 滨海县| 余干县| 新蔡县| 新乡县| 岱山县| 莲花县| 宁安市| 和政县| 垫江县| 绥芬河市| 台州市| 隆尧县| 夹江县| 公主岭市| 巴楚县| 平阳县|