天天看點

iOS新的視訊開發架構AVPlayerViewContoller與畫中畫技術

        前面有一篇部落格探讨了ios中視訊播放的開發相關類和方法,那篇部落格中主要講解的是meidaplayer架構中的mpmovieplayercontroller類和mpmovieplayerviewcontroller類。在ios8中,ios開發架構中引入了一個新的視訊架構avkit,其中提供了視訊開發類avplayerviewcontroller用于在應用中嵌入播放視訊的控件。在ios8中,這兩個架構中的視訊播放功能并無太大差異,基本都可以滿足開發者的需求。ios9系統後,ipad air正式開始支援多任務與畫中畫的分屏功能,所謂畫中畫,即是使用者可以将目前播放的視訊縮小放在螢幕上同時進行其他應用程式的使用。這個革命性的功能将極大的友善使用者的使用。于此同時,在ios9中,mpmovieplayercontroller與mpmovieplayerviewcontroller類也被完全易用,開發者使用avplayerviewcontroller可以十分友善的實作視訊播放的功能并在一些型号的ipad上內建畫中畫的功能。

        使用avplayerviewcontroller首先需要引入兩個架構,如下:

<a href="http://my.oschina.net/u/2340880/blog/622290#">?</a>

1

2

<code>#import &lt;avkit/avkit.h&gt;</code>

<code>#import &lt;avfoundation/avfoundation.h&gt;</code>

使用如下代碼進行視訊的播放:

3

4

5

<code>    </code><code>nsstring * path = [[nsbundle mainbundle]pathforresource:@</code><code>"iphone"</code> <code>oftype:@</code><code>"mp4"</code><code>];</code>

<code>    </code><code>nsurl *url = [nsurl fileurlwithpath:path];</code>

<code>    </code><code>avplayerviewcontroller * play = [[avplayerviewcontroller alloc]init];</code>

<code>    </code><code>play.player = [[avplayer alloc]initwithurl:url];</code>

<code>    </code><code>[self presentviewcontroller:play animated:yes completion:nil];</code>

運作工程,可以看到如下圖所示的視訊播放界面:

iOS新的視訊開發架構AVPlayerViewContoller與畫中畫技術

avplayerviewcontroller中還有如下屬性和方法提供給開發者使用:

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<code>//是否顯示視訊播放控制控件</code>

<code>@property (nonatomic) </code><code>bool</code> <code>showsplaybackcontrols;</code>

<code>//設定視訊播放界面的尺寸縮放選項</code>

<code>/*</code>

<code>可以設定的值及意義如下:</code>

<code>avlayervideogravityresizeaspect   不進行比例縮放 以寬高中長的一邊充滿為基準</code>

<code>avlayervideogravityresizeaspectfill 不進行比例縮放 以寬高中短的一邊充滿為基準</code>

<code>avlayervideogravityresize     進行縮放充滿螢幕</code>

<code>*/</code>

<code>@property (nonatomic, copy) nsstring *videogravity;</code>

<code>//擷取是否已經準備好開始播放</code>

<code>@property (nonatomic, readonly, getter = isreadyfordisplay) </code><code>bool</code> <code>readyfordisplay;</code>

<code>//擷取視訊播放界面的尺寸</code>

<code>@property (nonatomic, readonly) cgrect videobounds;</code>

<code>//視訊播放器的視圖 自定義的控件可以添加在其上</code>

<code>@property (nonatomic, readonly, nullable) uiview *contentoverlayview;</code>

<code>//畫中畫代理 ios9後可用</code>

<code>@property (nonatomic, weak, nullable) id &lt;avplayerviewcontrollerdelegate&gt; delegate ns_available_ios(9_0);</code>

<code>//是否支援畫中畫 ios9後可用 預設支援</code>

<code>@property (nonatomic) </code><code>bool</code> <code>allowspictureinpictureplayback ns_available_ios(9_0);</code>

        avplayerviewcontroller是預設支援畫中畫操作的,如上圖所示,視訊的播放界面右下角出現一個畫中畫的按鈕,點選這個按鈕目前播放的視訊界面會縮小顯示在螢幕角落,這時點選home鍵回到主界面,或者切換到其他應用程式,視訊播放不會中斷。如下圖所示:

iOS新的視訊開發架構AVPlayerViewContoller與畫中畫技術
iOS新的視訊開發架構AVPlayerViewContoller與畫中畫技術

avplayerviewcontrollerdelegate中的方法可以對使用者畫中畫的操作進行監聽:

21

22

<code>//将要開始畫中畫時調用的方法</code>

<code>- (</code><code>void</code><code>)playerviewcontrollerwillstartpictureinpicture:(avplayerviewcontroller *)playerviewcontroller{</code>

<code>}</code>

<code>//已經開始畫中畫時調用的方法</code>

<code>- (</code><code>void</code><code>)playerviewcontrollerdidstartpictureinpicture:(avplayerviewcontroller *)playerviewcontroller{</code>

<code>//開始畫中畫失敗調用的方法</code>

<code>- (</code><code>void</code><code>)playerviewcontroller:(avplayerviewcontroller *)playerviewcontroller failedtostartpictureinpicturewitherror:(nserror *)error{</code>

<code>//将要停止畫中畫時調用的方法</code>

<code>- (</code><code>void</code><code>)playerviewcontrollerwillstoppictureinpicture:(avplayerviewcontroller *)playerviewcontroller{</code>

<code>//已經停止畫中畫時調用的方法</code>

<code>- (</code><code>void</code><code>)playerviewcontrollerdidstoppictureinpicture:(avplayerviewcontroller *)playerviewcontroller{</code>

<code>//是否在開始畫中畫時自動将目前的播放界面dismiss掉 傳回yes則自動dismiss 傳回no則不會自動dismiss</code>

<code>- (</code><code>bool</code><code>)playerviewcontrollershouldautomaticallydismissatpictureinpicturestart:(avplayerviewcontroller *)playerviewcontroller{</code>

<code>    </code><code>return</code> <code>yes;</code>

<code>//使用者點選還原按鈕 從畫中畫模式還原回app内嵌模式時調用的方法</code>

<code>- (</code><code>void</code><code>)playerviewcontroller:(avplayerviewcontroller *)playerviewcontroller restoreuserinterfaceforpictureinpicturestopwithcompletionhandler:(</code><code>void</code> <code>(^)(</code><code>bool</code> <code>restored))completionhandler{</code>

繼續閱讀