iOS視頻流開發(2) — 視頻播放

來源:互聯網
上載者:User

標籤:

承上篇,本篇文章主要介紹iOS視頻播放需要用到的類。以及他們的使用情境和開發中遇到的問題。

MPMoviePlayerViewControllerMP簡介

iOS提供MPMoviePlayerController類進行播放,支援流媒體和檔案播放。MPMoviePlayerController足夠強大,幾乎不用寫幾行代碼就能完成一個播放器。視頻內容會渲染到他的View上,這個View可以移動、縮放,放在任何使用者想放的地方,而在縮放移動的過程中視頻都可以正常的播放,完全不受影響。
通常我們在ipad上會做這樣的小窗播放功能,讓使用者可以邊看視頻邊看電子書或者瀏覽網頁。

MP支援的格式
  • MPMoviePlayerController既支援本地視頻檔案的播放也支援流媒體(HTTP Live Streaming)
  • MPMoviePlayerController因為使用的是硬解碼,所以支援的檔案格式只有以H264為編碼格式的MP4、MOV、M4V、M2V、3GP等。
  • MPMoviePlayerController支援大多數音頻編碼。
  • 其他格式的解碼比如rmvb,可以考慮第三方解碼架構ffmpeg。ffmpeg等第三方解碼架構使用的是軟解碼,所以手機的發熱和耗電非常的恐怖,如非必要,不要使用。
  • 視頻格式的相關知識的詳細介紹:iOS視頻流開發(1)—視頻基礎知識
MP開發注意事項
  • 由於MPMoviePlayerViewController的初始化方法做了大量工作,例如設定URL、自動播放、添加點擊Done完成的監控等。所以儘可能重用,而不要頻繁的銷毀重新建立,重用一個MPMoviePlayerViewController非常簡單,將新的播放地址設定過去就可以了

  • MPMoviePlayerViewController進入全屏播放模式的時候,一定要監聽他的stop狀態,並進行處理,繼續播放或者退出全屏。否則一直停在全螢幕模式下。

  • MPMoviePlayerViewController是一個很複雜的視圖結構,我們有時候需要對播放器添加一些控制項。我建議不要在MPMoviePlayerViewController上修改,因為MP在iOS4、5、6、7上的視圖結構都不一樣,添加自訂控制項非常容易出問題。那需求又必須讓我們加入自訂的控制項怎麼辦呢?這個時候我們就需要用到AVPlayer了。

AVPlayerAVPlayer簡介

當需要自訂播放器的樣式時,我們可以使用AVPlayer。AVPlayer在AVFoundation架構中,相比MPMoviePlayerController它更加接近於底層。由於AVPlayer是作用在layer上,效率會比MP高一些。

AVPlayer播放

AVPlayer本身並不能顯示視頻。他通過建立一個播放器層AVPlayerLayer用於展示視頻,播放器層繼承於CALayer,有了AVPlayerLayer之後,將AVPlayerLayer添加到控制器視圖的layer中即可。相比MP直接傳入一個URL,AVPlayer播放的時候略微複雜一些,需要用到以下資料結構:

  • AVURLAsset:AVAsset的子類,可以根據一個URL路徑建立一個包含媒體資訊的AVURLAsset對象。

  • AVPlayerItem:一個媒體資源管理對象,管理者視頻的一些基本資料和狀態,一個AVPlayerItem對應著一個視頻資源。

AVPlayer擷取播放狀態
  • 視頻載入狀態
    通過KVO監聽AVPlayerItem的status屬性來獲得。當AVPlayerItem的status屬性為AVPlayerStatusReadyToPlay時,表明視頻載入完成。
  • 視頻緩衝狀態
    同樣,通過KVO監聽AVPlayerItem的loadedTimeRanges屬性來獲得。視頻每緩衝一部分這個屬性資料就會被更新,當loadedTimeRanges的值改變時可以獲得本次緩衝載入的視頻範圍,包含起始時間、本次載入時間長度),這樣一來就可以即時獲得緩衝情況。
  • 播放進度狀態
    通過AVPlayer的- (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block方法獲得播放進度,這個方法會在設定的時間間隔內定時更新播放進度。
AVQueuePlayer

AVQueuePlayer用於列表播放,雖然AVPlayer通過監聽播放狀態也可以做到視頻結束後的自動切換,但是使用AVQueuePlayer載入會快很多。應該是AVFoundation架構對AVQueuePlayer進行了最佳化,排隊的視頻會進行預先載入。

iOS視頻播放:

iOS提供MPMoviePlayerController這個類有個非常難用的點,就是他的頻播放狀態和視頻載入狀態都是通過Notification通知狀態變化,而不是通過block或者delegate。在實際使用中稍微不注意就會出問題,尤其是在視頻列表中。如果蘋果的工程師不是腦子進水的話,為什麼這樣設計呢?
我認為之所以這樣設計的原因是,無論MPMoviePlayerController還是AVPlayer,都只是一個外殼,他們內部都是用了一個同一個CoreMedia的播放組件,這個播放組件是全域單例。包括iOS瀏覽器使用的播放器(瀏覽器的播放器以plugin的形式嵌入)都是使用的這個播放核心。所以理論上也就不可能在一部iOS裝置上同時播放兩個視頻,一個播放另一個必然停止,無論它是網頁還是本地。那麼Notification這樣的應用程式級的通知方式似乎比block或者delegate這樣類層級的方式更合理。
大家可以試試,看看用原生播放器能否做到一個iOS裝置上同時播放兩個視頻。

 

  

iOS視頻流開發(2) — 視頻播放

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.