gyorgy@0:  gyorgy@0: package htmlelements gyorgy@0: { gyorgy@0: import flash.display.Sprite; gyorgy@0: import flash.events.*; gyorgy@0: import flash.net.NetConnection; gyorgy@0: import flash.net.NetStream; gyorgy@0: import flash.media.Video; gyorgy@0: import flash.media.SoundTransform; gyorgy@0: import flash.utils.Timer; gyorgy@0: import fl.video.* gyorgy@0: gyorgy@0: import FlashMediaElement; gyorgy@0: import HtmlMediaEvent; gyorgy@0: gyorgy@0: public class VideoElement extends Sprite implements IMediaElement gyorgy@0: { gyorgy@0: private var _currentUrl:String = ""; gyorgy@0: private var _autoplay:Boolean = true; gyorgy@0: gyorgy@0: private var _video:VideoPlayer; gyorgy@0: private var _ncManager:NCManager; gyorgy@0: gyorgy@0: private var _soundTransform; gyorgy@0: private var _element:FlashMediaElement; gyorgy@0: private var _oldVolume:Number = 1; gyorgy@0: gyorgy@0: // event values gyorgy@0: private var _duration:Number; gyorgy@0: private var _framerate:Number; gyorgy@0: private var _isPaused:Boolean = false; gyorgy@0: private var _isEnded:Boolean = false; gyorgy@0: private var _isLoaded:Boolean = false; gyorgy@0: private var _volume:Number = 1; gyorgy@0: private var _isMuted:Boolean = false; gyorgy@0: gyorgy@0: private var _bytesLoaded:Number = 0; gyorgy@0: private var _bytesTotal:Number = 0; gyorgy@0: private var _bufferedTime:Number = 0; gyorgy@0: gyorgy@0: gyorgy@0: private var _timer:Timer; gyorgy@0: gyorgy@0: gyorgy@0: public function get video():Video { gyorgy@0: return _video; gyorgy@0: } gyorgy@0: gyorgy@0: gyorgy@0: public function VideoElement(element:FlashMediaElement, autoplay:Boolean) gyorgy@0: { gyorgy@0: _element = element; gyorgy@0: _autoplay = autoplay; gyorgy@0: gyorgy@0: _video = new VideoPlayer(); gyorgy@0: _video.scaleMode = VideoScaleMode.MAINTAIN_ASPECT_RATIO; gyorgy@0: _video.width = _element.stage.stageWidth; gyorgy@0: _video.height = _element.stage.stageHeight; gyorgy@0: _ncManager = _video.ncMgr; gyorgy@0: addChild(_video); gyorgy@0: gyorgy@0: gyorgy@0: _video.addEventListener(VideoEvent.READY, videoReadyHandler); gyorgy@0: _video.addEventListener(MetadataEvent.METADATA_RECEIVED, videoMetadataReceivedHandler); gyorgy@0: _video.addEventListener(VideoEvent.COMPLETE, videoCompleteHandler); gyorgy@0: _video.addEventListener(VideoEvent.STATE_CHANGE, videoStateChangeHandler); gyorgy@0: gyorgy@0: gyorgy@0: _timer = new Timer(200); gyorgy@0: _timer.addEventListener("timer", timerHandler); gyorgy@0: } gyorgy@0: gyorgy@0: private function timerHandler(e:TimerEvent) { gyorgy@0: gyorgy@0: _bytesLoaded = _video.bytesLoaded; gyorgy@0: _bytesTotal = _video.bytesTotal; gyorgy@0: gyorgy@0: sendEvent(HtmlMediaEvent.TIMEUPDATE); gyorgy@0: gyorgy@0: trace("bytes", _bytesLoaded, _bytesTotal); gyorgy@0: gyorgy@0: if (_bytesLoaded < _bytesTotal) gyorgy@0: sendEvent(HtmlMediaEvent.PROGRESS); gyorgy@0: } gyorgy@0: gyorgy@0: private function videoReadyHandler(e) { gyorgy@0: _isLoaded = true; gyorgy@0: sendEvent(HtmlMediaEvent.LOADED_DATA); gyorgy@0: } gyorgy@0: gyorgy@0: private function videoMetadataReceivedHandler(e:MetadataEvent) { gyorgy@0: _duration = e.info.duration; gyorgy@0: gyorgy@0: sendEvent(HtmlMediaEvent.LOADED_DATA); gyorgy@0: } gyorgy@0: gyorgy@0: private function videoCompleteHandler(e) { gyorgy@0: gyorgy@0: sendEvent(HtmlMediaEvent.ENDED); gyorgy@0: } gyorgy@0: gyorgy@0: private function videoProgressHandler(e) { gyorgy@0: _bytesLoaded = _video.bytesLoaded; gyorgy@0: _bytesTotal = _video.bytesTotal; gyorgy@0: sendEvent(HtmlMediaEvent.PROGRESS); gyorgy@0: } gyorgy@0: private function videoStateChangeHandler(e) { gyorgy@0: //sendEvent(HtmlMediaEvent.PROGRESS); gyorgy@0: } gyorgy@0: gyorgy@0: gyorgy@0: gyorgy@0: // interface members gyorgy@0: public function setSrc(url:String):void { gyorgy@0: if (_isLoaded) { gyorgy@0: // stop and restart gyorgy@0: _video.pause(); gyorgy@0: } gyorgy@0: gyorgy@0: _currentUrl = url; gyorgy@0: } gyorgy@0: gyorgy@0: public function load():void { gyorgy@0: _video.load(_currentUrl); gyorgy@0: _isLoaded =false; gyorgy@0: } gyorgy@0: gyorgy@0: public function play():void { gyorgy@0: gyorgy@0: if (_isLoaded) { gyorgy@0: _video.play(); gyorgy@0: _timer.start(); gyorgy@0: _isPaused = false; gyorgy@0: _isLoaded = true; gyorgy@0: sendEvent(HtmlMediaEvent.PLAYING); gyorgy@0: } else { gyorgy@0: // error: play() called without a URL gyorgy@0: _video.play(_currentUrl); gyorgy@0: _timer.start(); gyorgy@0: _isPaused = false; gyorgy@0: _isLoaded = true; gyorgy@0: sendEvent(HtmlMediaEvent.PLAYING); gyorgy@0: } gyorgy@0: gyorgy@0: } gyorgy@0: gyorgy@0: public function pause():void { gyorgy@0: _video.pause(); gyorgy@0: _isPaused = true; gyorgy@0: _timer.stop(); gyorgy@0: gyorgy@0: _isPaused = true; gyorgy@0: sendEvent(HtmlMediaEvent.PAUSED); gyorgy@0: } gyorgy@0: gyorgy@0: public function setCurrentTime(pos:Number):void { gyorgy@0: _video.seek(pos); gyorgy@0: sendEvent(HtmlMediaEvent.SEEKED); gyorgy@0: } gyorgy@0: gyorgy@0: public function setVolume(volume:Number):void { gyorgy@0: _soundTransform = new SoundTransform(volume); gyorgy@0: _video.soundTransform = _soundTransform; gyorgy@0: _volume = volume; gyorgy@0: gyorgy@0: _isMuted = (_volume == 0); gyorgy@0: gyorgy@0: sendEvent(HtmlMediaEvent.VOLUMECHANGE); gyorgy@0: } gyorgy@0: gyorgy@0: gyorgy@0: public function setMuted(muted:Boolean):void { gyorgy@0: gyorgy@0: if (_isMuted == muted) gyorgy@0: return; gyorgy@0: gyorgy@0: if (muted) { gyorgy@0: _oldVolume = _video.soundTransform.volume; gyorgy@0: setVolume(0); gyorgy@0: } else { gyorgy@0: setVolume(_oldVolume); gyorgy@0: } gyorgy@0: gyorgy@0: _isMuted = muted; gyorgy@0: } gyorgy@0: gyorgy@0: gyorgy@0: private function sendEvent(eventName:String) { gyorgy@0: gyorgy@0: // calculate this to mimic HTML5 gyorgy@0: _bufferedTime = _bytesLoaded / _bytesTotal + _duration; gyorgy@0: gyorgy@0: // build JSON gyorgy@0: var values:String = gyorgy@0: "{duration:" + _duration + gyorgy@0: ",framerate:" + _framerate + gyorgy@0: ",currentTime:" + _video.playheadTime + gyorgy@0: ",muted:" + _isMuted + gyorgy@0: ",paused:" + _isPaused + gyorgy@0: ",ended:" + _isEnded + gyorgy@0: ",volume:" + _volume + gyorgy@0: ",bytesTotal:" + _bytesTotal + gyorgy@0: ",bufferedBytes:" + _bytesLoaded + gyorgy@0: ",bufferedTime:" + _bufferedTime + gyorgy@0: "}"; gyorgy@0: gyorgy@0: _element.sendEvent(eventName, values); gyorgy@0: } gyorgy@0: } gyorgy@0: } gyorgy@0: