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: