承上篇,本篇文章主要介紹iOS視頻播放須要用到的類。以及他們的使用場景和開發中遇到的問題。html
iOS提供MPMoviePlayerController類進行播放,支持流媒體和文件播放。MPMoviePlayerController足夠強大,幾乎不用寫幾行代碼就能完成一個播放器。視頻內容會渲染到他的View上,這個View能夠移動、縮放,放在任何用戶想放的地方,而在縮放移動的過程當中視頻均可以正常的播放,徹底不受影響。
一般咱們在ipad上會作這樣的小窗播放功能,讓用戶能夠邊看視頻邊看電子書或者瀏覽網頁。ios
因爲MPMoviePlayerViewController的初始化方法作了大量工做,例如設置URL、自動播放、添加點擊Done完成的監控等。因此儘量重用,而不要頻繁的銷燬從新建立,重用一個MPMoviePlayerViewController很是簡單,將新的播放地址設置過去就能夠了git
MPMoviePlayerViewController進入全屏播放模式的時候,必定要監聽他的stop狀態,並進行處理,繼續播放或者退出全屏。不然一直停在全屏模式下。github
MPMoviePlayerViewController是一個很複雜的視圖結構,咱們有時候須要對播放器添加一些控件。我建議不要在MPMoviePlayerViewController上修改,由於MP在iOS四、五、六、7上的視圖結構都不同,添加自定義控件很是容易出問題。那需求又必須讓咱們加入自定義的控件怎麼辦呢?這個時候咱們就須要用到AVPlayer了。瀏覽器
當須要自定義播放器的樣式時,咱們可使用AVPlayer。AVPlayer在AVFoundation框架中,相比MPMoviePlayerController它更加接近於底層。因爲AVPlayer是做用在layer上,效率會比MP高一些。數據結構
AVPlayer自己並不能顯示視頻。他經過建立一個播放器層AVPlayerLayer用於展現視頻,播放器層繼承於CALayer,有了AVPlayerLayer以後,將AVPlayerLayer添加到控制器視圖的layer中便可。相比MP直接傳入一個URL,AVPlayer播放的時候略微複雜一些,須要用到如下數據結構:框架
AVURLAsset:AVAsset的子類,能夠根據一個URL路徑建立一個包含媒體信息的AVURLAsset對象。iphone
AVPlayerItem:一個媒體資源管理對象,管理者視頻的一些基本信息和狀態,一個AVPlayerItem對應着一個視頻資源。優化
AVQueuePlayer用於列表播放,雖然AVPlayer經過監聽播放狀態也能夠作到視頻結束後的自動切換,可是使用AVQueuePlayer加載會快不少。應該是AVFoundation框架對AVQueuePlayer進行了優化,排隊的視頻會進行預加載。ui
iOS提供MPMoviePlayerController這個類有個很是難用的點,就是他的頻播放狀態和視頻加載狀態都是經過Notification通知狀態變化,而不是經過block或者delegate。在實際使用中稍微不注意就會出問題,尤爲是在視頻列表中。若是蘋果的工程師不是腦子進水的話,爲何這樣設計呢? 我認爲之因此這樣設計的緣由是,不管MPMoviePlayerController仍是AVPlayer,都只是一個外殼,他們內部都是用了一個同一個CoreMedia的播放組件,這個播放組件是全局單例。包括iOS瀏覽器使用的播放器(瀏覽器的播放器以plugin的形式嵌入)都是使用的這個播放內核。因此理論上也就不可能在一部iOS設備上同時播放兩個視頻,一個播放另外一個必然中止,不管它是網頁仍是本地。那麼Notification這樣的應用程序級的通知方式彷佛比block或者delegate這樣類級別的方式更合理。 你們能夠試試,看看用原生播放器可否作到一個iOS設備上同時播放兩個視頻。