ios如何實(shí)現(xiàn)流媒體播放器

這篇文章主要為大家展示了“ios如何實(shí)現(xiàn)流媒體播放器”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“ios如何實(shí)現(xiàn)流媒體播放器”這篇文章吧。

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括西吉網(wǎng)站建設(shè)、西吉網(wǎng)站制作、西吉網(wǎng)頁(yè)制作以及西吉網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,西吉網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到西吉省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

演示效果

ios如何實(shí)現(xiàn)流媒體播放器

ios如何實(shí)現(xiàn)流媒體播放器

ios如何實(shí)現(xiàn)流媒體播放器

ios如何實(shí)現(xiàn)流媒體播放器

附上項(xiàng)目地址 chenfengxiaoxixi

實(shí)現(xiàn)功能

實(shí)現(xiàn)了流媒體音樂(lè)播放,后臺(tái)持續(xù)播放,歌曲切換,進(jìn)度條顯示以及快進(jìn)后退等功能。

實(shí)現(xiàn)技術(shù)點(diǎn)及流程

1.單例

播放器所在controller我是使用單例初始化的,不然pop到上一級(jí)控制器后,當(dāng)前對(duì)象釋放掉,就無(wú)法播放了

+ (instancetype)sharePlayerController
{
  @synchronized(self)
  {
    static CFPlayerController *_instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
      _instance = [[self alloc] init];
    });
    
    return _instance;
  }
}

這里使用了線程同步,避免由卡頓造成的多次初始化。

2.后臺(tái)持續(xù)播放

先在xcode配置里面(TARGETS->Capabilities)打開(kāi)Background Modes,勾選上Audio那一欄?,F(xiàn)在只是滿足了后臺(tái)播放條件,要想連續(xù)不斷在后臺(tái)播放,還要申請(qǐng)后臺(tái)任務(wù)id。

//添加后臺(tái)播放任務(wù)
  UIBackgroundTaskIdentifier bgTask = 0;
  if([UIApplication sharedApplication].applicationState== UIApplicationStateBackground) {    
    NSLog(@"后臺(tái)播放");    
    UIApplication*app = [UIApplication sharedApplication];    
    UIBackgroundTaskIdentifier newTask = [app beginBackgroundTaskWithExpirationHandler:nil];    
    if(bgTask!= UIBackgroundTaskInvalid) {      
      [app endBackgroundTask: bgTask];
    }
    
    bgTask = newTask;
    [self next];
  }
  else {    
    NSLog(@"前臺(tái)播放");
    [self.cdView scrollRightWIthNext];
    
  }

播放完成一首歌后,這段代碼用來(lái)判斷當(dāng)前處于前臺(tái)還是后臺(tái),如果是后臺(tái),那就申請(qǐng)后臺(tái)任務(wù)繼續(xù)播放下一首。

3.鎖屏后對(duì)音樂(lè)播放的操作及信息顯示

需要重寫remoteControlReceivedWithEvent,用來(lái)獲取鎖屏后對(duì)播放器的操作

- (void)remoteControlReceivedWithEvent: (UIEvent *) receivedEvent
{
  [CF_NOTI_CENTER postNotificationName:@"remoteControl" object:nil userInfo:@{@"event":receivedEvent}];
}

該通知發(fā)送到播放控制器,在播放控制器實(shí)現(xiàn)處理邏輯

- (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:
            //暫停歌曲時(shí),動(dòng)畫(huà)也要暫停
            [self.cdView playOrPause];
      break;      
      default:
      break;
    }
  }
}

更新鎖屏后音樂(lè)的顯示信息

//鎖屏顯示信息
- (void)configNowPlayingInfoCenter
{
  if (NSClassFromString(@"MPNowPlayingInfoCenter")) {    
    NSMutableDictionary * dict = [[NSMutableDictionary alloc] init];    
    [dict setObject:CFUSER.currentSong.songName forKey:MPMediaItemPropertyTitle];    
    [dict setObject:@(self.playTime)forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
    //音樂(lè)的總時(shí)間
    [dict setObject:@(self.totalTime)forKey:MPMediaItemPropertyPlaybackDuration];    
    [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:dict];    
  }
}

4.關(guān)于FreeStreamer的使用

初始化,開(kāi)始播放

- (void)buildStreamer
{
  weakSELF;
  // 網(wǎng)絡(luò)文件
  NSURL *url = [NSURL URLWithString:CFUSER.currentSong.url];
  
  if (!_audioStream) {
    _audioStream = [[FSAudioStream alloc] initWithUrl:url];
    _audioStream.onFailure = ^(FSAudioStreamError error,NSString *description){
      NSLog(@"播放過(guò)程中發(fā)生錯(cuò)誤,錯(cuò)誤信息:%@",description);
      [weakSelf showAlertMsg:description];
    };
    _audioStream.onCompletion=^(){
      //播放完成后,執(zhí)行下一步
      [weakSelf autoPlayNext];
    };
    
    // 設(shè)置聲音
    [_audioStream setVolume:1];
    //開(kāi)始播放
    [_audioStream play];
  }
  else
  {
    _audioStream.url = url;
    [_audioStream play];
  }
}

停止播放

[self.audioStream stop];

暫停播放和繼續(xù)播放為同一個(gè)方法,別問(wèn)為什么,作者就是這樣寫的

[self.audioStream pause];

快進(jìn)后退播放

- (void)dragSliderEnd:(UISlider *)slider{
  //滑動(dòng)到底時(shí),播放下一曲
  if (slider.value == 1) {
     [self.cdView scrollRightWIthNext];
  }
  else
  {
    if (slider.value > 0)
    {
      //初始化一個(gè)FSStreamPosition結(jié)構(gòu)體
      FSStreamPosition pos;
      //只對(duì)position賦值,value由slider控制
      pos.position = slider.value;
      [self.audioStream seekToPosition:pos];// 到指定位置播放
    }
  }
}

以上是“ios如何實(shí)現(xiàn)流媒體播放器”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁(yè)題目:ios如何實(shí)現(xiàn)流媒體播放器
標(biāo)題鏈接:http://muchs.cn/article48/iiodhp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、小程序開(kāi)發(fā)營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站收錄、企業(yè)網(wǎng)站制作電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)