欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ios 流媒體播放器實(shí)現(xiàn)流程及FreeStreamer的使用的示例

 更新時(shí)間:2018年01月04日 09:53:57   作者:cfxiaoxixi  
本篇文章主要介紹了ios 流媒體播放器實(shí)現(xiàn)流程及FreeStreamer的使用的示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下

簡(jiǎn)介

最近實(shí)現(xiàn)了一個(gè)流媒體播放器,使用的是FreeStreamer庫(kù),至于為什么不用avaudioplayer或者avplayer,前一個(gè)是不能播放網(wǎng)絡(luò)音樂(lè),后一個(gè)則是體驗(yàn)不好,緩存不夠會(huì)暫停,然后又要手動(dòng)播放。去github上搜了下,發(fā)現(xiàn)FreeStreamer評(píng)分比較高,于是就用它來(lái)實(shí)現(xiàn)了一個(gè)流媒體播放器。

演示效果

附上項(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)在只是滿(mǎ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è)播放的操作及信息顯示

需要重寫(xiě)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)為什么,作者就是這樣寫(xiě)的

[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];// 到指定位置播放
    }
  }
}

結(jié)語(yǔ)

以上就是實(shí)現(xiàn)流媒體音樂(lè)播放器的大概知識(shí)點(diǎn),ui是自己自定義的(圖標(biāo)素材主要源于網(wǎng)上),一些動(dòng)畫(huà)的思路是用了某某云音后,然后根據(jù)自己掌握的一些知識(shí)來(lái)實(shí)現(xiàn)的。想看詳細(xì)實(shí)現(xiàn)流程和源碼的可以去我的項(xiàng)目地址查看。

戳這里 chenfengxiaoxixi

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 提高iOS開(kāi)發(fā)的小技巧和思路小結(jié) (二)

    提高iOS開(kāi)發(fā)的小技巧和思路小結(jié) (二)

    這篇文章主要跟大家分享了關(guān)于提高iOS開(kāi)發(fā)的一些小技巧和思路,通過(guò)本文總結(jié)的這些小技巧和思路相信對(duì)對(duì)大家開(kāi)發(fā)iOS具有一定的參考價(jià)值,感興趣的朋友們可以參考學(xué)習(xí),下面來(lái)跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-04-04
  • iOS 檢測(cè)文本中的URL、電話號(hào)碼等信息

    iOS 檢測(cè)文本中的URL、電話號(hào)碼等信息

    本文主要介紹了iOS 檢測(cè)文本中的URL、電話號(hào)碼等信息的相關(guān)資料。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • IOS實(shí)現(xiàn)微信朋友圈相冊(cè)評(píng)論界面的翻轉(zhuǎn)過(guò)渡動(dòng)畫(huà)

    IOS實(shí)現(xiàn)微信朋友圈相冊(cè)評(píng)論界面的翻轉(zhuǎn)過(guò)渡動(dòng)畫(huà)

    現(xiàn)在很多人幾乎每天都離不開(kāi)微信,大家有沒(méi)有發(fā)現(xiàn)在點(diǎn)開(kāi)微信相冊(cè)的時(shí)候,想要在相冊(cè)圖片界面跳轉(zhuǎn)查看點(diǎn)贊和評(píng)論時(shí),微信會(huì)采用界面翻轉(zhuǎn)的過(guò)渡動(dòng)畫(huà)來(lái)跳轉(zhuǎn)到評(píng)論界面,點(diǎn)擊完成又會(huì)翻轉(zhuǎn)回到圖片界面,這不同于一般的導(dǎo)航界面滑動(dòng)動(dòng)畫(huà),于是學(xué)著做了一下,有需要一起看看。
    2016-08-08
  • iOS實(shí)現(xiàn)轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的3種方法示例

    iOS實(shí)現(xiàn)轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的3種方法示例

    這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的3種方法,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • iOS開(kāi)發(fā)中不合法的網(wǎng)絡(luò)請(qǐng)求地址如何解決

    iOS開(kāi)發(fā)中不合法的網(wǎng)絡(luò)請(qǐng)求地址如何解決

    這篇文章主要介紹了iOS開(kāi)發(fā)中不合法的網(wǎng)絡(luò)請(qǐng)求地址的解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • iOS中使用UItableviewcell實(shí)現(xiàn)團(tuán)購(gòu)和微博界面的示例

    iOS中使用UItableviewcell實(shí)現(xiàn)團(tuán)購(gòu)和微博界面的示例

    這篇文章主要介紹了iOS中使用UItableviewcell實(shí)現(xiàn)團(tuán)購(gòu)和微博界面的示例,開(kāi)發(fā)語(yǔ)言基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2016-01-01
  • iOS10 widget實(shí)現(xiàn)3Dtouch 彈出菜單

    iOS10 widget實(shí)現(xiàn)3Dtouch 彈出菜單

    這篇文章主要介紹了 iOS10 widget實(shí)現(xiàn)3Dtouch 彈出菜單的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • iOS 對(duì)當(dāng)前webView進(jìn)行截屏的方法

    iOS 對(duì)當(dāng)前webView進(jìn)行截屏的方法

    下面小編就為大家?guī)?lái)一篇iOS 對(duì)當(dāng)前webView進(jìn)行截屏的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • IOS給圖片添加水印(兩種方式)

    IOS給圖片添加水印(兩種方式)

    為了防止自己辛苦做的項(xiàng)目被別人盜走,采取把圖片添加水印,在此表示圖片的獨(dú)一無(wú)二。加水印不是要在上面添加上幾個(gè)Label,而是我們要把字畫(huà)到圖片上成為一個(gè)整體,下面這篇文章主要介紹IOS給圖片添加水印,有需要的小伙伴可以來(lái)參考下
    2015-08-08
  • IOS 簽名錯(cuò)誤codesign failed with exit code 1解決方法

    IOS 簽名錯(cuò)誤codesign failed with exit code 1解決方法

    這篇文章主要介紹了IOS 簽名錯(cuò)誤codesign failed with exit code 1解決方法的相關(guān)資料,遇到同樣問(wèn)題的朋友可以看下,這里提供了解決方案,需要的朋友可以參考下
    2017-01-01

最新評(píng)論