티스토리 뷰

오늘 오전 플래시 플레이어가 10.2버전이 정식으로 릴리즈 되었습니다.
10.2로 업데이트 되면서 퍼포먼스 측면에서 많은 변화가 있었는데요. 그 중 단연 StageVideo를 손으로 꼽을 수 있을 것 같습니다.

StageVideo를 이용하면, 플래시 플레이어가 GPU가속을 사용하게 되면서, 기존 대비 65%이상의 성능 향상이 있었다는 평가입니다. 특히 OSX에서 가히 놀라울만한 퍼포먼스를 보여주더군요.

이 외에

  1. 네이티브 마우스커서를 사용할 수 있게 되었습니다. 이젠 Mouse.hide()를 사용해 굳이 구현을 하지 않아도 됩니다.
  2. 기존에 듀얼 이상의 멀티 모니터를 사용할 경우, 플래시로 전체화면을 사용하게 되면, 다른 모니터로 커서를 옮겨 클릭 할 경우 전체화면이 해제되었는데.. 이젠 이런 걱정을 하지 않아도 됩니다. 멀티 스크린에서 전체 화면이 유지됩니다!
  3. IE9에서 하드웨어 가속을 사용할 수 있게 되었습니다.
  4. Sub-pixel 텍스트 렌더링이 강화되었습니다.
  5. 자세한 사항은 http://www.adobe.com/products/flashplayer/features/ 페이지를 참고하세요!

정식 릴리즈도 되었으니, 샘플 소스 공유해 봅니다.  ^^)/

참!! StageViedeo를 사용할 때 주의할 점이 있습니다.!!!!

1. wmode는 direct만 지원합니다.
2. 플레이어 10.2 이하 사용자를 위해, video객체를 이용해서 StageView를 사용하지 못할 때를 대비하는 방식으로 호환성을 유지해 주셔야 합니다.
 
[DEMO]

To view this page ensure that Adobe Flash Player version 10.2.0 or greater is installed.

package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.NetStatusEvent;
import flash.events.StageVideoAvailabilityEvent;
import flash.events.StageVideoEvent;
import flash.geom.Rectangle;
import flash.media.StageVideo;
import flash.media.StageVideoAvailability;
import flash.net.NetConnection;
import flash.net.NetStream;

[SWF(frameRate="1", backgroundColor="#000000", width="720", height="480")]
public class StageVideoSample extends Sprite
{
	//------------------------------------------------
	// Class Constants
	//------------------------------------------------
	
	/**
	 * Video file path (such as H.264 video file)
	 * http://www.h264info.com/clips.html에서 샘플 영상 다운로드 가능
	 */		
	private const VIDEO_PATH:String = 
		"http://images.apple.com/movies/us/hd_gallery/gl1800/1080p/batman_begins_1080p.mov";
	
	//------------------------------------------------
	// Class Variables
	//------------------------------------------------
	
	/**
	 * Stage Video Object 
	 */		
	private var _sVideo:StageVideo = null;
	
	/**
	 * Stage Video viewport size 
	 */		
	private var _viewportRect:Rectangle;
	
	/**
	 * NetConnection to play video file 
	 */		
	private var _nc:NetConnection;
	
	/**
	 * NetStream 
	 */		
	private var _ns:NetStream;
	
	//------------------------------------------------
	// Constructor
	//------------------------------------------------
	
	/**
	 * Constructor 
	 * 
	 */		
	public function StageVideoSample()
	{
		addEventListener(Event.ADDED_TO_STAGE, onStage);
	}
	
	//------------------------------------------------
	// Class Methods
	//------------------------------------------------
	
	/**
	 *  
	 * @param $e
	 * 
	 */		
	private function onStage($e:Event):void
	{
		init();
	}
	
	/**
	 * initialize 
	 * 
	 */		
	private function init():void
	{				
		stage.scaleMode = StageScaleMode.NO_SCALE;
		stage.align = StageAlign.TOP_LEFT;
		_viewportRect = new Rectangle();
		readyStageVideo();
		configureEvents();
	}
	
	/**
	 * ready for StageVideo 
	 * 
	 */		
	private function readyStageVideo():void
	{
		_nc = new NetConnection();
		_nc.connect(null);				
		_ns = new NetStream(_nc);
		_ns.client = this;		
	}
	
	/**
	 * Configure application event 
	 * 
	 */		
	private function configureEvents():void
	{
		stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, 
			onStageVideoStateHandler);
		
		_ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatusHandler);
	}
	
	/**
	 * play video 
	 * 
	 */		
	private function playVideo():void
	{
		_sVideo = stage.stageVideos[0];			
		
		if(!_sVideo.hasEventListener(StageVideoEvent.RENDER_STATE))
			_sVideo.addEventListener(StageVideoEvent.RENDER_STATE, stageVideoStateChange);
		
		_sVideo.attachNetStream(_ns);			
		_ns.play(VIDEO_PATH);
	}
	
	/**
	 * invalidate size 
	 * 
	 */		
	private function invalidateVideoSize():void
	{	
		var videoWidth:uint = _sVideo.videoWidth;
		var videoHeight:uint = _sVideo.videoHeight;
		
		var scaling:Number = Math.min (
			stage.stageWidth / videoWidth, 
			stage.stageHeight / videoHeight);
		
		videoWidth *= scaling;
		videoHeight *= scaling;				
		
		_viewportRect.x = stage.stageWidth - videoWidth >> 1;
		_viewportRect.y = stage.stageHeight - videoHeight >> 1;
		_viewportRect.width = videoWidth;
		_viewportRect.height = videoHeight;
		
		_sVideo.viewPort = _viewportRect;
		
	}
	
	//------------------------------------------------
	// Event Handlers
	//------------------------------------------------
	
	/**
	 * check video state 
	 * @param $e
	 * 
	 */		
	private function stageVideoStateChange($e:StageVideoEvent):void
	{
		trace("StageVideoEvent:: " + $e.status);
		invalidateVideoSize();
	}			
	
	/**
	 * NetStatus Handler 
	 * @param $e
	 * 
	 */		
	private function onNetStatusHandler($e:NetStatusEvent):void
	{
		trace("NetStatusEvent:: " + $e.info.code);
	}
	
	/**
	 * Check StageVideo feature in player 
	 * @param $e
	 * 
	 */		
	private function onStageVideoStateHandler($e:StageVideoAvailabilityEvent):void
	{
		trace("StageVideoAvailabilityEvent:: " + $e.availability);
		
		if(StageVideoAvailability.AVAILABLE == $e.availability)
			playVideo();				
	}
	
	/**
	 * For NetStream client method
	 * @param $e
	 * 
	 */		
	public function onMetaData ($e:Object):void
	{
		trace($e.duration);
	}
	
}
}




저작자 표시 비영리 동일 조건 변경 허락
신고
댓글
댓글쓰기 폼