TubeLoc:YouTube 播放器 AS3 程式庫

本文由外部開發人員撰寫及提交。YouTube API 團隊感謝 Ben Longoria 抽空提供專業知識。


Ben Longoria,威斯康辛大學麥迪遜分校,學術技術
2009 年 2 月

簡介

TubeLoc Chromeless Player 示範
圖 1:TubeLoc 無 Chrome 播放器示範

哇,截至本文撰寫時,YouTube Player API 推出約一個月,這相當於網際網路上的多少年?許多優秀的專案都是使用這項 API 建構而成。只要追蹤 YouTube Developer API 網誌,就能看到許多人運用這項 API 創造出精彩內容。

目前的 YouTube API 播放器應用程式是使用 ActionScript 2 編寫,雖然這仍是相當實用的語言,但許多人現在都使用 ActionScript 3 和/或 Flex。問題是,您必須經過幾個環節,才能讓 ActionScript 2 應用程式與 ActionScript 3 應用程式通訊。您可能會問:「等等...我好像聽過這個,不是已經有相關功能了嗎?」

許多人已經瞭解如何執行這項操作,並在 YouTube API 開發人員論壇分享心得。我們也推出了 AS3 無邊框包裝函式Flex 嵌入式播放器專案,方便開發人員使用。

我希望能以簡單的方式,只在 ActionScript 3 或 MXML 中重複使用 Player API 功能。針對不支援 Flex 的專案提供無 Flex 的類別,以及針對支援 Flex 的專案提供簡單易用的 Flex 元件。TubeLoc 符合這兩項規定

TubeLoc (YouTube 和 LocalConnection 的混合) 是 ActionScript 3 程式庫,可做為 YouTube ActionScript 2 Player API 的轉接器。您可以使用全螢幕或無邊框 YouTube 播放器,輕鬆在 ActionScript 3 或 Flex 應用程式中加入 YouTube 影片功能。TubeLoc 會使用 LocalConnection 類別與 ActionScript 2 中介軟體 SWF 進行通訊。ActionScript 2 SWF 會與官方 YouTube API 播放器通訊。那麼我們該如何使用這個東西?

整體情勢

首先,請從 Google Code 專案下載程式庫的最新版本。解壓縮發布版本的 ZIP 封存檔後,您會在其中找到 as3 目錄。在這個目錄下方是 src 目錄,其中包含一些範例類別。您可以從這些做起,src 目錄中的 com/enefekt/tubeloc 下有兩個檔案。Movie.as 可用於 Flex 專案,MovieSprite.as 則可用於 ActionScript 3 專案。在 com/enefekt/tubeloc/event 中,有各種事件類別可用於處理可由播放器傳送的不同通知。

在嘗試本教學課程的範例之前,請確認 as3 目錄中的 src 目錄位於您的類別路徑中。這項程序的步驟會因您用來開發的工具而異,因此請查看開發環境的說明文件。

編譯完成示範或應用程式後,您需要使用 ActionScript 2 SWF 與 YouTube 影片播放器 API 進行通訊。您可以在以下版本封存檔中找到這個 SWF:as3/lib/as2_tubeloc.swf。只要確保它與嵌入 SWF 應用程式的 HTML 檔案並列即可,如下所示:

my_app/
  my_app.html
  as2_tubeloc.swf
  my_app.swf

注意:您可以使用程式庫中的 playerWrapperUrl 屬性,變更這個 SWF 的路徑。

使用 Movie.as

接下來,我們來看看如何使用 Flex 版本的 TubeLoc。我們會先看一下全 Chrome 播放器 (含所有控制項),然後再看一下 BYOC 無控制項播放器。以下是如何在 MXML 中使用全 Chrome 播放器:

<tubeloc:Movie id="tubelocMovie" width="320" height="240" 
		videoId="GJ1sZBTnbuE" />

我知道,我知道,很痛對吧?答錯了。那麼,讓我們來做個瘋狂的實驗,看看沒有邊框的效果如何:

<tubeloc:Movie id="tubelocMovie" width="320" height="240" 
		videoId="GJ1sZBTnbuE" chromeless="true" />

我們會再加入一個屬性,讓您更頭痛,因此,整個 MXML 檔案的樣貌如下:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
		xmlns:tubeloc="com.enefekt.tubeloc.*">
   
	<!-- TubeLoc Movie Component -->
	<tubeloc:Movie id="tubelocMovie" width="320" height="240" 
			videoId="GJ1sZBTnbuE" chromeless="true" />
	
</mx:Application> 

注意:在 mx:Application 元素中,我們會為 Movie 元件新增 tubeloc 命名空間和套件。完成後,我們就可以使用元件,如下圖所示。稍後我們會探討可在這個元件上設定及呼叫的內容。

使用 MovieSprite.as

接下來,我們來看看如何使用 ActionScript 3 版本的 TubeLoc。這個版本不需要 Flex 架構的類別,只使用 Flash Player 原生類別。我們會先說明如何製作全 Chrome 播放器,再說明如何製作無控制項播放器。以下是完整範例:

package {
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;

	import com.enefekt.tubeloc.MovieSprite;
	import com.enefekt.tubeloc.event.*;

	[SWF(backgroundColor="#FFFFFF")]
	public class MainChromed extends Sprite {
		private var youtubeMovie:MovieSprite;

		public function MainChromed() {
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			
			youtubeMovie = new MovieSprite("7tTNOX8jfno");
			youtubeMovie.addEventListener(PlayerReadyEvent.PLAYER_READY, onPlayerReady);
			youtubeMovie.x = 10;
			youtubeMovie.y = 10;
			addChild(youtubeMovie);
		}

		private function onPlayerReady(event_p:PlayerReadyEvent):void {
			youtubeMovie.width = 640;
			youtubeMovie.height = 480 + MovieSprite.CHROME_HEIGHT;
		}
	}
}

首先,我們會匯入必要的 TubeLoc 類別。接著,我們會在建構函式中建立 MovieSprite 類別的例項,並將影片 ID 傳遞至 MovieSprite 的建構函式。接著,我們會為 PlayerReadyEvent 新增事件監聽器。在 onPlayerReady 事件處理常式中,我們會設定電影的大小。注意:由於我們使用的是全 Chrome 播放器,因此我們會利用 MovieSprite 類別上的靜態屬性 CHROME_HEIGHT。這有助於我們在調整電影大小時考量到邊框的高度。

好的,那麼無控制項播放器呢?

package {
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
		
	import com.enefekt.tubeloc.MovieSprite;
	import com.enefekt.tubeloc.event.*;
	
	[SWF(backgroundColor="#FFFFFF")]
	public class MainChromeless extends Sprite {
		private var youtubeMovie:MovieSprite;
		
		public function MainChromeless() {
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			
			youtubeMovie = new MovieSprite(null, true);
			youtubeMovie.addEventListener(PlayerReadyEvent.PLAYER_READY, onPlayerReady);
			youtubeMovie.x = 10;
			youtubeMovie.y = 10;
			addChild(youtubeMovie);
		}
		
		private function onPlayerReady(event_p:PlayerReadyEvent):void {
			youtubeMovie.width = 640;
			youtubeMovie.height = 480;
			youtubeMovie.loadVideoById("7tTNOX8jfno");
		}
	}
}

那麼,兩者有何不同?在建構函式中,我們會傳遞 null 做為影片 ID,而第二個 true 參數會告訴 MovieSprite 類別,我們要使用無邊框模式。您也會發現 onPlayerReady 事件處理常式有所不同。我們會使用 loadVideoById 方法,根據 ID 載入影片。

我可以撥打哪些電話?

那麼,您可以呼叫哪些項目,以及要處理哪些事件?您下載的發布封存檔案中,包含完整的程式碼說明文件,可讓您瞭解詳細資訊。快速概略說明,Movie.as 和 MovieSprite.as 都提供以下方法:

seekTo(seconds:Number, allowSeekAhead:Boolean=true):void

setVolume(volume:Number):void

getVolume():Number

unMute():void

mute():void

clearVideo():void

setSize(width:Number, height:Number):void

loadVideoById(videoId:String, startSeconds:Number = 0):void [Chromeless player only] 

cueVideoById(videoId:String, startSeconds:Number = 0):void [Chromeless player only] 

stopVideo():void

playVideo():void

pauseVideo():void

destroy():void

除了這些方法之外,您還可以在 Movie.as 元件中存取下列屬性:

playerReady:Boolean

chromeless:Boolean

videoId:String

stateDescription:String

currentTime:Number 

duration:Number 

videoUrl:String 

videoEmbedCode:String 

volume:Number

以下是您可以訂閱的事件。如需更多詳細資訊,請參閱說明文件。

onError

onStateChange

onMovieStateUpdate

onMovieProgress

onPlayerReady

onPlayerUnload

結論

希望這篇文章有助您在 Flash 應用程式中整合 YouTube 功能和內容。使用 TubeLoc 開發時,請注意以下限制:您無法在舞台上同時顯示兩個 YouTube 播放器。

希望這個問題能在適當時間內解決。因此,如果您發現錯誤或缺少某些功能,請造訪 Google Code 專案,並在 Issue Tracker 中回報。感謝閱讀!

作者簡介


Ben Longoria

Ben Longoria 是威斯康辛大學麥迪遜分校的學術應用程式開發人員。他自 Flash 5 以來就一直使用 Flash 進行開發,並自 Flex 2 發布以來使用 Flex。過去 2 年來,他也一直在開發 Mozilla 技術支援的應用程式。Ben 曾參與多項教育和學術專案,包括針對瀏覽器和電腦端的跨平台應用程式。他積極參與介面和互動設計,並樂於接受打造實用軟體的挑戰。你可以前往 http://enefekt.com/sansbrowser/ 瀏覽他的網誌,並閱讀他在 InsideRIA 的文章。



創用 CC 授權
這項作品採用的授權為 Creative Commons Attribution 3.0 United States License