TubeLoc: คลัง AS3 ของ YouTube Player

บทความนี้เขียนและส่งโดยนักพัฒนาแอปภายนอก ทีม YouTube API ขอขอบคุณ Ben Longoria ที่สละเวลาและแสดงความเชี่ยวชาญ


Ben Longoria, มหาวิทยาลัยวิสคอนซิน - แมดิสัน, เทคโนโลยีทางวิชาการ
กุมภาพันธ์ 2009

บทนำ

สาธิตการใช้ TubeLoc Chromeless Player
รูปที่ 1: การสาธิตโปรแกรมเล่น TubeLoc แบบไม่มี Chrome

ว้าว อีกเพียงไม่กี่เดือน YouTube Player API จะครบรอบ 1 ปี นั่นคือกี่ปีในอินเทอร์เน็ต มีโปรเจ็กต์ดีๆ จำนวนมากที่สร้างจาก API นี้ คุณเพียงต้องติดตามบล็อก YouTube Developer API ก็จะเห็นว่ามีผู้คนจำนวนมากที่สร้างสิ่งดีๆ ขึ้นมาด้วย API นี้

ชุดแอปพลิเคชันโปรแกรมเล่น YouTube API ปัจจุบันเขียนด้วย ActionScript 2 แม้ว่าภาษานี้จะยังคงเป็นภาษาที่ยอดเยี่ยม แต่ปัจจุบันผู้คนจำนวนมากใช้ ActionScript 3 และ/หรือ Flex ปัญหาคือคุณต้องดำเนินการหลายอย่างเพื่อให้แอปพลิเคชัน ActionScript 2 สื่อสารกับแอปพลิเคชัน ActionScript 3 ได้ คุณอาจสงสัยว่า "เดี๋ยวก่อน...ฉันคิดว่าเคยได้ยินเรื่องนี้มาก่อน ไม่ได้มีเครื่องมือสำหรับเรื่องนี้อยู่แล้วใช่ไหม"

ผู้คนจำนวนมากค้นพบวิธีดำเนินการนี้แล้วและได้แชร์ความรู้ในฟอรัมนักพัฒนา YouTube API นอกจากนี้ ยังมีโปรเจ็กต์ AS3 Chromeless Wrapper และ Flex Embedded Player เพื่อช่วยนักพัฒนาแอปใช้งานได้ง่ายขึ้น

ฉันต้องการวิธีง่ายๆ ในการนําฟังก์ชันการทำงานของ Player API มาใช้ซ้ำใน ActionScript 3 หรือ MXML เท่านั้น คลาสที่ไม่มี Flex สำหรับโปรเจ็กต์ที่ไม่ชอบ Flex และคอมโพเนนต์ Flex ที่ใช้งานง่ายสำหรับโปรเจ็กต์ที่รัก Flex TubeLoc เป็นไปตามข้อกำหนดทั้ง 2 ข้อ

TubeLoc (การรวม YouTube เข้ากับ LocalConnection) คือไลบรารี ActionScript 3 ที่ทำหน้าที่เป็นอะแดปเตอร์สำหรับ YouTube ActionScript 2 Player API คุณเพิ่มฟังก์ชันการทำงานของวิดีโอ YouTube ลงในแอปพลิเคชัน ActionScript 3 หรือ Flex ได้อย่างง่ายดายด้วยโปรแกรมเล่น YouTube แบบมีแถบเครื่องมือหรือแบบไม่มีแถบเครื่องมือ TubeLoc ใช้คลาส LocalConnection ในการสื่อสารกับ SWF ตัวกลาง ActionScript 2 SWF ของ ActionScript 2 จะสื่อสารกับโปรแกรมเล่น YouTube API อย่างเป็นทางการ แล้วเราจะใช้ฟีเจอร์นี้อย่างไร

แผนผังภาพรวม

ก่อนอื่น คุณควรดาวน์โหลดไลบรารีรุ่นปัจจุบันจากโปรเจ็กต์ Google Code หลังจากแตกไฟล์ ZIP ของรุ่นแล้ว คุณจะเห็นไดเรกทอรี as3 อยู่ภายใน ด้านล่างนี้คือไดเรกทอรี src ซึ่งมีคลาสตัวอย่างบางส่วน คุณสามารถใช้ข้อมูลเหล่านี้เป็นจุดเริ่มต้นได้ ภายใต้ com/enefekt/tubeloc ในไดเรกทอรี src มี 2 ไฟล์ Movie.as คือสิ่งที่คุณใช้ในโปรเจ็กต์ Flex ได้ และ MovieSprite.as คือสิ่งที่คุณใช้ในโปรเจ็กต์ ActionScript 3 ได้ ใน com/enefekt/tubeloc/event มีคลาสเหตุการณ์ต่างๆ สําหรับการแจ้งเตือนที่ส่งจากโปรแกรมเล่นได้

ก่อนลองทำตามตัวอย่างในบทแนะนำนี้ โปรดตรวจสอบว่าไดเรกทอรี src ในไดเรกทอรี as3 อยู่ในเส้นทางคลาสของคุณ กระบวนการนี้จะแตกต่างกันไปตามสิ่งที่คุณใช้พัฒนา ดังนั้นโปรดอ่านเอกสารประกอบสำหรับสภาพแวดล้อมการพัฒนาของคุณ

เมื่อคอมไพล์ไฟล์เดโมหรือแอปพลิเคชันแล้ว คุณจะต้องมี SWF ของ ActionScript 2 ที่สื่อสารกับ YouTube Player API คุณดู SWF นี้ได้ในที่เก็บถาวรของรุ่นที่นี่ as3/lib/as2_tubeloc.swf เพียงตรวจสอบว่าไฟล์อยู่ข้างไฟล์ HTML ที่มีการฝังแอปพลิเคชัน SWF ดังตัวอย่างต่อไปนี้

my_app/
  my_app.html
  as2_tubeloc.swf
  my_app.swf

หมายเหตุ: คุณเปลี่ยนเส้นทางไปยัง SWF นี้โดยใช้พร็อพเพอร์ตี้ playerWrapperUrl กับไลบรารีได้

การใช้ Movie.as

มาดูวิธีใช้ TubeLoc เวอร์ชัน Flex กัน เราจะดูที่โปรแกรมเล่นแบบ Chrome เต็มรูปแบบ (ที่มีการควบคุมทั้งหมด) ก่อน จากนั้นจึงดูที่โปรแกรมเล่นแบบไม่ใช้ Chrome ที่ BYOC วิธีใช้โปรแกรมเล่นแบบเต็มหน้าจอใน MXML มีดังนี้

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

เราทราบดีว่าเจ็บปวด ไม่เลย มาลองใช้โหมด Chromeless กัน

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

เราขอเพิ่มความปวดหัวด้วยแอตทริบิวต์อีก 1 รายการ ไฟล์ 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 เราจะเพิ่มเนมสเปซ tubeloc ที่มีแพ็กเกจสำหรับคอมโพเนนต์ภาพยนตร์ หลังจากทําเช่นนี้แล้ว เราจะใช้คอมโพเนนต์ได้ตามที่สาธิต เราจะมาดูสิ่งที่มีให้ตั้งค่าและเรียกใช้คอมโพเนนต์นี้ในภายหลัง

การใช้ MovieSprite.as

ตอนนี้เรามาดูวิธีใช้ TubeLoc เวอร์ชัน ActionScript 3 กัน เวอร์ชันนี้ไม่ต้องใช้คลาสจากเฟรมเวิร์ก Flex และใช้เฉพาะคลาสเนทีฟของ Flash Player เท่านั้น เราจะดูวิธีใช้เพลเยอร์แบบเต็ม Chrome ก่อน แล้วค่อยดูวิธีใช้เพลเยอร์แบบไม่ใช้ 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 และส่งรหัสวิดีโอไปยังคอนสตรคเตอร์ของ MovieSprite ถัดไป เราจะเพิ่ม Listener เหตุการณ์สําหรับ PlayerReadyEvent ในเครื่องจัดการเหตุการณ์ onPlayerReady เรากําหนดขนาดของภาพยนตร์ หมายเหตุ: เนื่องจากเราใช้เพลเยอร์แบบ Chrome แบบเต็ม เราจึงใช้ประโยชน์จากพร็อพเพอร์ตี้แบบคงที่ CHROME_HEIGHT ในคลาส MovieSprite ซึ่งช่วยให้เราปรับขนาดภาพยนตร์โดยคำนึงถึงความสูงของแถบโครเมียม

โอเค แล้วผู้ชมที่ไม่ใช้ 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 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 สำหรับรหัสวิดีโอ และพารามิเตอร์ true ตัวที่ 2 จะบอกคลาส MovieSprite ว่าเรากำลังจะใช้โหมด Chromeless นอกจากนี้ คุณยังจะเห็นความแตกต่างในตัวแฮนเดิลเหตุการณ์ onPlayerReady ด้วย นี่เป็นจุดที่เราโหลดวิดีโอตามรหัสโดยใช้เมธอด loadVideoById

ฉันจะโทรหาใครได้บ้างและจะได้รับอะไรบ้าง

มีอะไรบ้างที่โทรได้ และเราต้องดำเนินการกับเหตุการณ์ใด ในที่เก็บถาวรของรุ่นที่คุณดาวน์โหลดจะมีเอกสารประกอบโค้ดฉบับเต็มเพื่อให้คุณดูรายละเอียด ภาพรวมคร่าวๆ สำหรับทั้ง 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

บทสรุป

เราหวังว่าบทความนี้จะช่วยให้คุณผสานรวมฟังก์ชันการทำงานและเนื้อหาของ YouTube ในแอปพลิเคชัน Flash ได้ ข้อจำกัดที่ควรทราบขณะพัฒนาด้วย TubeLoc คือคุณไม่สามารถมีโปรแกรมเล่น YouTube 2 ตัวในสเตจพร้อมกัน

เราหวังว่าปัญหานี้จะได้รับการแก้ไขในไม่ช้า ดังนั้นเมื่อพบข้อบกพร่องหรือฟีเจอร์บางอย่างขาดหายไป โปรดไปที่โปรเจ็กต์ Google Code และรายงานปัญหาในเครื่องมือติดตามปัญหา ขอขอบคุณที่อ่าน

ประวัติผู้แต่ง


Ben Longoria

Ben Longoria เป็นนักพัฒนาแอปพลิเคชันทางวิชาการของมหาวิทยาลัยวิสคอนซิน-แมดิสัน เขาพัฒนาซอฟต์แวร์ด้วย Flash มาตั้งแต่ Flash 5 และ Flex มาตั้งแต่รุ่น 2 ในช่วง 2 ปีที่ผ่านมา เขายังพัฒนาแอปพลิเคชันที่ทำงานด้วย Mozilla ด้วย Ben เคยทำงานในโปรเจ็กต์ด้านการศึกษาและวิชาการหลายโปรเจ็กต์ รวมถึงแอปพลิเคชันข้ามแพลตฟอร์มที่มุ่งเน้นทั้งเบราว์เซอร์และเดสก์ท็อป เขามีส่วนร่วมในการออกแบบอินเทอร์เฟซและการโต้ตอบ และชอบความท้าทายในการสร้างซอฟต์แวร์ที่ใช้งานได้ คุณสามารถดูบล็อกของเขาได้ที่ http://enefekt.com/sansbrowser/ และอ่านบทความที่เขาเขียนให้ InsideRIA



สัญญาอนุญาตครีเอทีฟคอมมอนส์ (Creative Commons License)
ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 3.0 ของสหรัฐอเมริกา