Search This Blog

7/23/16

在 Android 的影片 3D 範例程式碼

在 Android 的影片 3D 範例程式碼

下載範例程式碼

簡介

您可在 Android 非常輕鬆地建立應用程式播放影片,也可以輕鬆建立具有 3D 圖形表面的遊戲應用程式。不過要建立應用程式在3D 圖形3D 圖形物件播放影片,就不是這麼簡單。本文說明作者為了因應以上挑戰所建立的應用程式。此應用程式可播放在 3D 表面渲染的影片,並可讓使用者以互動方式操控影片表面。
本項應用程式必須克服三項實作挑戰:
  1. 如何建構程式碼,讓使用者能夠變更 3D 表面,並同時播放影片。
  2. 雖然預設的 Android 媒體播放器配備齊全,擁有各種播放選項,但是並無法取得影片影像資料,不能以自訂方式加以渲染。
  3. 如何設計圖形元件執行影片資料渲染?
此應用程式也挑戰裝置功能,強迫影片及圖形物件同時運作。本文將說明此應用程式的功能及用途,然後簡述其設計。

功能

此應用程式具有下列功能:
  1. 可讓使用者由本機媒體庫選擇影片。
  2. 可於垂直及水平配置運作,配置變更時影片可繼續播放。
  3. 應用程式提供三種播放模式:
    1. 預設模式:這是標準播放模式,影片播放方式就和標準媒體播放器一樣。
    2. 隨機旋轉:影片表面會沿著水平及垂直軸隨機旋轉,色彩也會在紅色色調及一般色彩之間切換。
    3. 觸控旋轉:使用者可利用觸控方式左右滑動及旋轉表面,並可變更速度。
    4. 應用程式推向背景或關閉時,目前播放的影片將會儲存,並於應用程式重新啟動時再次播放。
附註: 沒有影片工作階段控制功能,使用者無法停止、快轉或回轉影片。若應用程式推向背景或停止,影片就只能從頭播放。

使用模式

開始播放影片

應用程式本身並沒有任何影片,因此使用者可選擇 Android 平台支援的任何影片。不過建議使用採用 MPEG-4 容器 H.264AVC 轉碼器的影片,因為這是開發期間用於測試的格式。應用程式首次啟動時,將顯示檔案選擇器畫面 (請參閱前頁螢幕截圖)。
使用者選擇偏好的檔案選擇器之後,就會在螢幕上出現指示。選擇影片後,就將開始播放。
附註: 有時需要等一下影片才會播放,大約 5~10 秒鐘。

選擇不同模式

應用程式會以標準模式啟動。如欲變更模式,使用者可按 UI 的選項按鈕,啟動選項功能表。
選項功能表提供四個選項:前三個為播放模式選項,最後一個可讓使用者選擇不同影片。
 

隨機旋轉

此選項可讓渲染影片的表面沿著水平及垂直軸隨機旋轉,並顯示 3D 效果,也可以定期在螢幕上顯示紅色。
 

觸控旋轉

在觸控旋轉模式中,使用者可左右滑動,讓表面沿著垂直軸左右旋轉。如果加快滑動速度,旋轉就會加速,如果使用者停止滑動,就會自然減速。
 

設計

此應用程式的三大主要元件為:UI 元件提供使用者應用程式的互動展示;影片元件執行影片播放;OpenGL* 表面可渲染影片幀緩衝器,並於特殊模式建立 3D 效果。
影片播放元件有兩個執行緒。影片引擎執行緒使用 MediaCodec 類別。此類別於 Android JellyBean 版本 (API 16) 推出,暴露了 Android 媒體框架的低層級 API,因此可於框架層級控制播放。在每個影片幀,圖形資料可保留影像資料,並變更影像渲染的方式。
播放元件也實作音訊引擎執行緒,可播放影片音軌。為了同步影片及音訊執行緒,讓人物說話的嘴部動作與聲音相符,其中實作了 AV 同步演算法。影片播放時,一定會比較時間戳記及音訊時間戳記,並調整播放速度,讓影片幀絕對不超過 30 毫秒的時間限制。
圖形元件延伸 GLSurfaceView,將自訂的渲染類別內嵌至類別中。渲染類別實作渲染器介面,執行 OpenGL 渲染演算法。演算法在紋理表面實作 3D 旋轉效果,也依據使用者輸入將模式變更為不同演算法。
在渲染器中,影片幀的旋轉及色彩是由簡單的頂點及像素著色器處理。影片平面旋轉是由一系列的歐拉角 (Euler-angle) 旋轉執行。幀的著色是由線性混合的影片幀內容,以及像素著色器內部的固定色彩 (在此為紅色) 達成。
圖形元件也作為影片引擎的影片幀接聽程式,並於建構期間傳遞給 MediaCodec 物件,每次影片幀可用時就會呼叫渲染函數。圖形元件在 UI 元件中有函式,因此使用者可變更播放模式。
MediaCodec 解碼程序以影片幀的速度運作,圖形元件的渲染函數則以圖形幀的速度運作。因此在存取幀緩衝器時,兩個元件之中的函式必須同步。
相關連結及資源:
若要進一步瞭解更多 Android 開發者專用的 Intel 工具,請參閱 Intel® Developer Zone for Android.

關於作者

Mark Liu 於 Intel 超行動部門 (Ultra-Mobile Group) 擔任軟體工程師,負責開發 Android 型裝置的驗證架構。他也參與 Intel 超行動部門的多項 Android 專案,包括智慧型手機和平板裝置。這項工作大多與媒體播放、視訊會議及軟體堆疊效能調校有關。
Mark 加入 Intel 軟體與服務事業群的 Intel® Atom™ 處理器裝置軟體功能團隊後,曾參與多項橫向工作,包括開發 Android 媒體應用程式範例、Windows* 8 媒體架構系統最佳化,以及編寫媒體應用程式文件。
Chris Kirkpatrick 為軟體應用程式工程師,目前任職於 Intel 軟體與服務事業群,在視覺及互動運算工程 (Visual & Interactive Computing Engineering) 團隊負責支援 Intel 圖形解決方案,於奧勒岡州立大學 (Oregon State University) 取得電腦科學學士學位。

No comments:

Post a Comment

Related Posts Plugin for WordPress, Blogger...