*寫在前面
在公司上次的小版本迭代中,因?yàn)槲覀儸F(xiàn)在的項(xiàng)目是奢侈品買賣的平臺(tái),所以產(chǎn)品經(jīng)理要求加入現(xiàn)在絕大多數(shù)購(gòu)物平臺(tái)中詳情頁(yè)的視頻展示功能,所以在幾番查找資料中,完成了這個(gè)需求,現(xiàn)在將中間遇到的坑分享給大家,希望能幫助有需要的人!
iOS在播放視頻方面其實(shí)提供了好多的方法:
1、iOS9.0 之前
使用 MPMoviePlayerController, 或者內(nèi)部自帶一個(gè) view 的MPMoviePlayerViewController
2、iOS9.0之后
可以使用AVPictureInPictureController、AVPlayerViewController 或者 WKWebView
這些方式是蘋果高度封裝的,播放的樣式都是蘋果原生的,定制功能極少,使用方法很簡(jiǎn)單,直接創(chuàng)建,給URL就可以播放,支持本地視頻和網(wǎng)絡(luò)視頻。
AVPlayer是比較底層的,可以高度定制UI的播放器,比如你想要不一樣的播放界面,不一樣的快進(jìn)、播放、快退等按鈕和功能,你就需要用到AVPlayer了,下面我給出AVPlayer的簡(jiǎn)單實(shí)用方法,更高深的定制功能,在以后有時(shí)間的時(shí)候會(huì)再發(fā)一篇文章做專門描述。
1、創(chuàng)建
在開始之前我們需要引入兩個(gè)系統(tǒng)庫(kù)
[#import <AVKit/AVKit.h>
#import <AVFoundation/AVFoundation.h>
創(chuàng)建方法init或playerItemWithURL或者 initWithURL:在使用 AVPlayer 播放視頻時(shí),提供視頻信息的是 AVPlayerItem,一個(gè) AVPlayerItem 對(duì)應(yīng)著一個(gè)URL視頻資源。但是在創(chuàng)建AVPlayerItem的時(shí)候AVPlayerItem需要傳入一個(gè)AVAsset用來加載URL,具體創(chuàng)建代碼如下:

在開始加載視頻地址的時(shí)候我判斷了一下是本地的視頻還是網(wǎng)路視頻,因?yàn)槲覀冇斜镜氐囊曨l也有網(wǎng)絡(luò)的事情需要用這個(gè)播放器播放
使用AVPlayer 的時(shí)候,一定要注意 AVPlayer 、 AVPlayerLayer 和 AVPlayerItem 三者之間的關(guān)系。 AVPlayer 負(fù)責(zé)控制播放, layer 顯示播放,item 提供數(shù)據(jù),當(dāng)前播放時(shí)間, 已加載情況。 Item 中一些基本的屬性, status, duration, loadedTimeRanges, currentTime(當(dāng)前播放時(shí)間)。
初始化一個(gè) AVPlayItem 對(duì)象后,其屬性并不是馬上就可以使用。我們必須確保 AVPlayItem 已經(jīng)被加載好了,可以播放了,才能使用。 畢竟凡是和網(wǎng)絡(luò)扯上關(guān)系的都需要時(shí)間去加載。 所以我們需要監(jiān)聽目前播放的狀態(tài),用KVO進(jìn)行監(jiān)聽 AVPlayItem 的 status


如果你想在自動(dòng)播放結(jié)束后做些事情,那我們需要添加一個(gè)通知

在通知的實(shí)現(xiàn)方法里面做你想要做的事情,比如退出當(dāng)前頁(yè)面,或者更改一些狀態(tài)什么的!
*下面講一些我在做的時(shí)候遇到的一個(gè)坑
注意:我沒有給視頻加控制條,因?yàn)槲覀兊男枨笾皇遣シ哦桃曨l,并不需要控制暫停、播放、快進(jìn)、快退和展示時(shí)間!
在我做的時(shí)候一個(gè)問題一直困擾著我,視頻點(diǎn)開播放的時(shí)候視頻總是不能夠自適應(yīng)屏幕我剛開始的時(shí)候出來的效果是這樣的

整個(gè)視頻是以高為最大邊,橫向拉伸的,所以可以看出來屏幕兩邊都已經(jīng)超出了屏幕的顯示范圍
我起初就知道這肯定是由某個(gè)枚舉控制的值來控制拉伸的,但是不知道是AVPlayer、AVPlayItem還是AVPlayerLayer的某個(gè)枚舉值,找了很久,一直沒找到,我就先擱置了,直到項(xiàng)目要上線的時(shí)候,其他東西都寫完了,我覺得這個(gè)東西必須得搞一下的時(shí)候,我又重新看了一下我寫過的代碼,讓我不小心看到了一個(gè)屬性:videoGravity,這個(gè)屬性是AVPlayerLayer,讓我找的好苦,它有三個(gè)值分別是:

在我一一試過之后,我覺得柳暗花明,內(nèi)心無比的痛快,每每解決一個(gè)bug的時(shí)候內(nèi)心都是這種感覺,原來我剛開始的時(shí)候就有設(shè)置這個(gè)值,只不過我設(shè)置成了AVLayerVideoGravityResizeAspectFill,所以它是滿屏顯示的,然后我調(diào)成了其他的值AVLayerVideoGravityResize 、然后它的顯示效果是這樣的

其實(shí)它也是滿屏顯示的,只不過縱向做了壓縮,搞的本來是橫向的視頻被壓縮的豎向顯示了,然后我換了最后一種方AVLayerVideoGravityResizeAspect

這樣設(shè)置以后,視頻終于正常顯示了,顯示不到的地方都是黑色的,視頻也沒有被拉伸,顯示的這個(gè)問題已經(jīng)完美的被解決了,其實(shí)不設(shè)置的話默認(rèn)的值就是這個(gè)AVLayerVideoGravityResizeAspect,但是我都不知道我怎么設(shè)置上的,我也是醉了!
還有一點(diǎn),也不能算叫做坑,是一個(gè)不足吧,有些朋友在這樣做以后,發(fā)現(xiàn)視頻可以播放了,但是沒有聲音,這里我們需要加入一行代碼,來支持外放
