ADC 這兩天寄信通告開發者,隨著 iOS 4.0 已經正式上市,接下來如果要在 AppStore 上推出新軟體、或是更新版本,都一定要用 4.0 SDK 編譯。雖然是用 4.0 SDK,我們還是可以透過修改 Deployment Target 的方式,讓編譯出來的軟體也可以在使用 4.0 之前版本作業系統的裝置使用,不是什麼大問題。
不過,如果你的軟體裡頭需要播放影片,使用了系統提供的影片播放元件,就必須注意-MPMoviePlayerController 的宣告與實作變了。
從 2.0 版開始,iPhone 便提供 MPMoviePlayerController 這個 class,讓開發者在軟體中播放 H.264 影片。在呼叫了 alloc、initWithContentURL: 產生物件並指定要播放的影片的 URL 之後,就會直接產生、升起一個全螢幕的橫向播放畫面,蓋住你原本的程式畫面,載入、播放影片內容。或這麼說- MPMoviePlayerController 會幫你產生一個 UIWindow 物件,蓋在原本應用程式所在的主 window 上,其他還會產生 UIWindow 則包括文字輸入鍵盤…等。
雖然這個元件在設計上也有些問題-像之前提過,明明在 class 的 interface 中,就只容許一次指定一個影片的 URL,而不是提供一張可以讓你選取前後不同影片的播放列表,但居然畫面上會有向前與向後的按鈕,點下去之後會直接關閉影片,又不會驅動任何事件,不過,在這裡暫且不表。
如果直接把透過 3.1.3 之前 SDK 開發的影片程式碼,丟進最新的 SDK 編譯、執行,會遇到問題-可以聽到影片的聲音,但是看不到畫面。在 3.2 之後,MPMoviePlayerController 多了一個屬性叫做 view,想要看到影片的畫面,得要在目前畫面的某個 view 中,把 MPMoviePlayerController 的 view 透過 addSubview: 加上去。如果沒把這個 view 放上去,就不會看到畫面。
之所以會這樣修改的原因,在於 iPad 的推出。iPad 的 SDK 與開發工具雖然與 iPhone 完全相同,但是螢幕尺寸不同,使用者介面的設計也就自然不同。在 iPhone 螢幕上統一使用全螢幕播放影片,這沒問題,但是 iPad 上全都是全螢幕就說不過去,因此,將影片的畫面顯示部分拆出來,變成 view,就可以自行決定影片的尺寸以及擺放位置。iOS 4.0 中,繼續沿用從 3.2 起針對 iPad 所做的設計。
在接下來的日子裡,相信在使用影片播放時,會不斷過渡到新的 API 上,不過,在 iOS 4.0 剛推出、3.x 還是一堆人在用的時候,在做應用程式的時候,難免還是要做成雖然用 4.0 SDK 編,但是可以在 3.x 上執行的的版本。(更何況,還是會有人會把你的程式裝在 iPad 上,用 4.0 SDK 編譯的東西,至少也要向下相容到 3.2。)
我現在的作法是,在播放影片之前,先檢查一下目前的作業系統版本,如果是 3.2 之前,就產生 MPMoviePlayerController 物件,呼叫 play,反之,就產生 MPMoviePlayerViewController 物件。
MPMoviePlayerViewController 是 3.2 開始的 API,大抵上用途就與 3,2 之前的 MPMoviePlayerController 行為一樣,就是一個全螢幕的播放畫面,反正在 iPhone 上,就算是 3.x 或 4.0,都是用全螢幕播放影片。在產生這個物件之後,UIViewController 可以用 presentMoviePlayerViewControllerAnimated: 這個 method,升起影片播放畫面,比較不一樣的地方是,3.x 的 MPMoviePlayerController 只能夠橫向播放,MPMoviePlayerViewController 則在水平或垂直方向都可以播放影片。而要檢查目前裝置是否支援新的 API,也只要隨便問一個 UIViewController 支不支援 presentMoviePlayerViewControllerAnimated: 就好了。
順道一提,iPad 上面的影片播放元件,又有另外一個討厭的問題-在影片上面,有一個控制進入/退出全螢幕模式的按鈕,你沒辦法讓這個按鈕消失,不讓使用者只能在全螢幕或非全螢幕模式下使用,於是接著產生以下問題:
如果你產生了一個 MPMoviePlayerViewController,直接進入全螢幕播放,那麼,當使用者按下退出全螢幕按鈕,系統會不知道要把影片畫面回復到哪個 view 中,就會直接退出影片。
而且,MPMoviePlayerController 的 view,如果放在某個 modal view 裡頭,然後進入全螢幕模式,你會發現,modal view 的 level 比全螢幕播放畫面高,所以 modal view 會蓋在影片上頭,你的影片正中央有個空蕩蕩的 modal view,而因為 Touch 事件也都被 modal view 攔住,所以使用者再也點不到影片上面的各個操控按鈕。請參閱 rdar://8012810。
Pingback: Blog E » Blog Archive » [iOS]在iPHONE上使用MEDIA PLAYER播放的相關程式碼