iOS AVPlayer切換播放源實(shí)現(xiàn)連續(xù)播放和全屏切換的方法
本文主要給大家介紹了關(guān)于iOS AVPlayer切換播放源實(shí)現(xiàn)連續(xù)播放和全屏切換的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面來(lái)一起看看詳細(xì)的介紹:
AVPlayer 切換播放源有三種方式:
第一種:采用系統(tǒng)自帶的方法: [self.player replaceCurrentItemWithPlayerItem:item] ,但是在切換playItem前要把所有的通知,觀察者移除,切換后重新添加。

第二種:把通知,觀察者全部移除,player 置為nil,然后重新創(chuàng)建。

githup上ZFPlayer 作者表示在iOS9后,AVPlayer的replaceCurrentItemWithPlayerItem方法在切換視頻時(shí)底層會(huì)調(diào)用信號(hào)量等待然后導(dǎo)致當(dāng)前線(xiàn)程卡頓,如果在UITableViewCell中切換視頻播放使用這個(gè)方法,會(huì)導(dǎo)致當(dāng)前線(xiàn)程凍結(jié)幾秒鐘。遇到這個(gè)坑還真不好在系統(tǒng)層面對(duì)它做什么,后來(lái)找到的解決方法是在每次需要切換視頻時(shí),需重新創(chuàng)建AVPlayer和AVPlayerItem。
因?yàn)橐曨l較小,所以我沒(méi)有測(cè)試,這兩種方法暫時(shí)都可以使用。
第三種可以使用AVQueuePlayer播放多個(gè)items,AVQueuePlayer是AVPlayer的子類(lèi),可以用一個(gè)數(shù)組來(lái)初始化一個(gè)AVQueuePlayer對(duì)象。
代碼如下:
NSArray*items = <#An array of player items#>;AVQueuePlayer*queuePlayer = [[AVQueuePlayeralloc] initWithItems:items];
和AVPlayer一樣,直接調(diào)用play方法來(lái)播放,queue player順序播放隊(duì)列中的item,如果想要跳過(guò)一個(gè)item,播放下一個(gè)item,可以調(diào)用方法advanceToNextItem。
可以對(duì)隊(duì)列進(jìn)行插入和刪除操作,調(diào)用方法insertItem:afterItem: , removeItem: , 和removeAllItems。正常情況下當(dāng)插入一個(gè)item之前,應(yīng)該檢查是否可以插入,通過(guò)使用canInsertItem:afterItem:方法,第二個(gè)參數(shù)傳nil
親測(cè)第一種第二種沒(méi)有問(wèn)題,第三種當(dāng)然也可以實(shí)現(xiàn)連續(xù)播放,后續(xù)再研究。
看到ZFPlayer 的流暢性,就又使用了ZFPlayer作者使用的通知重新簡(jiǎn)單封了一遍,連播代碼。

連播 的邏輯無(wú)非就是重置Layer 和子控件位置,然后重新設(shè)置一遍。
關(guān)于橫豎屏切換的代碼:

沒(méi)有做封裝,可以封裝個(gè)方法,傳入當(dāng)前的oriention,然后很霸道的實(shí)現(xiàn)橫豎屏切換,demo 是用純代碼寫(xiě)的,還用了懶加載,這在橫豎屏切換的時(shí)候有很大的弊端,因?yàn)閼屑虞d的緣故,frame已經(jīng)確定,切換橫豎屏的時(shí)候不得已在layoutSubviews里把布局代碼重新寫(xiě)一遍,這時(shí)候就是Masonry 布局的好處了。(Masonry 要更新到最新,要不然iOS10 會(huì)崩潰,莫名其妙),還有就是返回的時(shí)候要再次調(diào)用這個(gè)方法設(shè)置為豎屏。實(shí)現(xiàn)橫豎屏的前提是當(dāng)前ViewController的- (UIInterfaceOrientationMask)supportedInterfaceOrientations 必須支持橫豎屏。
如果不想強(qiáng)制橫屏,只是在用戶(hù)旋轉(zhuǎn)手機(jī)的時(shí)候,更換布局,也可以使用下面的通知。

還有個(gè)問(wèn)題是循環(huán)引用的問(wèn)題:當(dāng)我們聲明一個(gè)非屬性的實(shí)例變量時(shí),在自己寫(xiě)的block里會(huì)造成循環(huán)引用,導(dǎo)致當(dāng)前view無(wú)法釋放。
demo
本地下載:http://xiazai.jb51.net/201705/yuanma/LXAVPlayerDemo(jb51.net).rar
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,新人一枚,沒(méi)有做良好的封裝,只是研究了一些思路。希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- 實(shí)例講解iOS中的UIPageViewController翻頁(yè)視圖控制器
- iOS開(kāi)發(fā)中導(dǎo)航控制器的基本使用教程
- 詳解iOS開(kāi)發(fā)中使用storyboard創(chuàng)建導(dǎo)航控制器的方法
- iOS應(yīng)用開(kāi)發(fā)中UITabBarController標(biāo)簽欄控制器使用進(jìn)階
- 學(xué)習(xí)iOS自定義導(dǎo)航控制器UINavigationController
- iOS開(kāi)發(fā)中的ViewController轉(zhuǎn)場(chǎng)切換效果實(shí)現(xiàn)簡(jiǎn)介
- iOS使用pageViewController實(shí)現(xiàn)多視圖滑動(dòng)切換
- 比較IOS開(kāi)發(fā)中常用視圖的四種切換方式
- iOS 頁(yè)面滑動(dòng)與標(biāo)題切換顏色漸變的聯(lián)動(dòng)效果實(shí)例
- iOS實(shí)現(xiàn)多控制器切換效果
相關(guān)文章
iOS開(kāi)發(fā)中使用Picker View實(shí)現(xiàn)一個(gè)點(diǎn)菜應(yīng)用的UI示例
這篇文章主要介紹了iOS開(kāi)發(fā)中使用Picker View實(shí)現(xiàn)一個(gè)點(diǎn)菜應(yīng)用的UI示例,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-01-01
iOS經(jīng)驗(yàn)之初始化方法中不該設(shè)置self.view的屬性淺析
這篇文章主要給大家介紹了關(guān)于iOS經(jīng)驗(yàn)之初始化方法中不該設(shè)置self.view的屬性的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-09-09
iOS實(shí)現(xiàn)多個(gè)彈框按順序依次彈出效果
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)多個(gè)彈框按順序依次彈出效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
簡(jiǎn)單好用可任意定制的iOS Popover氣泡效果
Popover(氣泡彈出框/彈出式氣泡/氣泡)是由一個(gè)矩形和三角箭頭組成的彈出窗口,箭頭指向的地方通常是導(dǎo)致Popover彈出的控件或區(qū)域。本文通過(guò)實(shí)例代碼給大家介紹了iOS Popover氣泡效果,需要的朋友參考下吧2017-12-12
iOS中長(zhǎng)條藍(lán)色按鈕(button)實(shí)現(xiàn)代碼
本文通過(guò)實(shí)例代碼給大家介紹了iOS中長(zhǎng)條藍(lán)色按鈕(button)實(shí)現(xiàn)方法,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-08-08

