annotate johndyer-mediaelement-13fa20a/src/flash/htmlelements/VideoElementVP.as @ 25:4a4bd554b4c1 tip

Closing this sub branch.
author Daniele Barchiesi <daniele.barchiesi@eecs.qmul.ac.uk>
date Mon, 25 Mar 2013 14:02:54 +0000
parents 032bc65ebafc
children
rev   line source
gyorgy@0 1 
gyorgy@0 2 package htmlelements
gyorgy@0 3 {
gyorgy@0 4 import flash.display.Sprite;
gyorgy@0 5 import flash.events.*;
gyorgy@0 6 import flash.net.NetConnection;
gyorgy@0 7 import flash.net.NetStream;
gyorgy@0 8 import flash.media.Video;
gyorgy@0 9 import flash.media.SoundTransform;
gyorgy@0 10 import flash.utils.Timer;
gyorgy@0 11 import fl.video.*
gyorgy@0 12
gyorgy@0 13 import FlashMediaElement;
gyorgy@0 14 import HtmlMediaEvent;
gyorgy@0 15
gyorgy@0 16 public class VideoElement extends Sprite implements IMediaElement
gyorgy@0 17 {
gyorgy@0 18 private var _currentUrl:String = "";
gyorgy@0 19 private var _autoplay:Boolean = true;
gyorgy@0 20
gyorgy@0 21 private var _video:VideoPlayer;
gyorgy@0 22 private var _ncManager:NCManager;
gyorgy@0 23
gyorgy@0 24 private var _soundTransform;
gyorgy@0 25 private var _element:FlashMediaElement;
gyorgy@0 26 private var _oldVolume:Number = 1;
gyorgy@0 27
gyorgy@0 28 // event values
gyorgy@0 29 private var _duration:Number;
gyorgy@0 30 private var _framerate:Number;
gyorgy@0 31 private var _isPaused:Boolean = false;
gyorgy@0 32 private var _isEnded:Boolean = false;
gyorgy@0 33 private var _isLoaded:Boolean = false;
gyorgy@0 34 private var _volume:Number = 1;
gyorgy@0 35 private var _isMuted:Boolean = false;
gyorgy@0 36
gyorgy@0 37 private var _bytesLoaded:Number = 0;
gyorgy@0 38 private var _bytesTotal:Number = 0;
gyorgy@0 39 private var _bufferedTime:Number = 0;
gyorgy@0 40
gyorgy@0 41
gyorgy@0 42 private var _timer:Timer;
gyorgy@0 43
gyorgy@0 44
gyorgy@0 45 public function get video():Video {
gyorgy@0 46 return _video;
gyorgy@0 47 }
gyorgy@0 48
gyorgy@0 49
gyorgy@0 50 public function VideoElement(element:FlashMediaElement, autoplay:Boolean)
gyorgy@0 51 {
gyorgy@0 52 _element = element;
gyorgy@0 53 _autoplay = autoplay;
gyorgy@0 54
gyorgy@0 55 _video = new VideoPlayer();
gyorgy@0 56 _video.scaleMode = VideoScaleMode.MAINTAIN_ASPECT_RATIO;
gyorgy@0 57 _video.width = _element.stage.stageWidth;
gyorgy@0 58 _video.height = _element.stage.stageHeight;
gyorgy@0 59 _ncManager = _video.ncMgr;
gyorgy@0 60 addChild(_video);
gyorgy@0 61
gyorgy@0 62
gyorgy@0 63 _video.addEventListener(VideoEvent.READY, videoReadyHandler);
gyorgy@0 64 _video.addEventListener(MetadataEvent.METADATA_RECEIVED, videoMetadataReceivedHandler);
gyorgy@0 65 _video.addEventListener(VideoEvent.COMPLETE, videoCompleteHandler);
gyorgy@0 66 _video.addEventListener(VideoEvent.STATE_CHANGE, videoStateChangeHandler);
gyorgy@0 67
gyorgy@0 68
gyorgy@0 69 _timer = new Timer(200);
gyorgy@0 70 _timer.addEventListener("timer", timerHandler);
gyorgy@0 71 }
gyorgy@0 72
gyorgy@0 73 private function timerHandler(e:TimerEvent) {
gyorgy@0 74
gyorgy@0 75 _bytesLoaded = _video.bytesLoaded;
gyorgy@0 76 _bytesTotal = _video.bytesTotal;
gyorgy@0 77
gyorgy@0 78 sendEvent(HtmlMediaEvent.TIMEUPDATE);
gyorgy@0 79
gyorgy@0 80 trace("bytes", _bytesLoaded, _bytesTotal);
gyorgy@0 81
gyorgy@0 82 if (_bytesLoaded < _bytesTotal)
gyorgy@0 83 sendEvent(HtmlMediaEvent.PROGRESS);
gyorgy@0 84 }
gyorgy@0 85
gyorgy@0 86 private function videoReadyHandler(e) {
gyorgy@0 87 _isLoaded = true;
gyorgy@0 88 sendEvent(HtmlMediaEvent.LOADED_DATA);
gyorgy@0 89 }
gyorgy@0 90
gyorgy@0 91 private function videoMetadataReceivedHandler(e:MetadataEvent) {
gyorgy@0 92 _duration = e.info.duration;
gyorgy@0 93
gyorgy@0 94 sendEvent(HtmlMediaEvent.LOADED_DATA);
gyorgy@0 95 }
gyorgy@0 96
gyorgy@0 97 private function videoCompleteHandler(e) {
gyorgy@0 98
gyorgy@0 99 sendEvent(HtmlMediaEvent.ENDED);
gyorgy@0 100 }
gyorgy@0 101
gyorgy@0 102 private function videoProgressHandler(e) {
gyorgy@0 103 _bytesLoaded = _video.bytesLoaded;
gyorgy@0 104 _bytesTotal = _video.bytesTotal;
gyorgy@0 105 sendEvent(HtmlMediaEvent.PROGRESS);
gyorgy@0 106 }
gyorgy@0 107 private function videoStateChangeHandler(e) {
gyorgy@0 108 //sendEvent(HtmlMediaEvent.PROGRESS);
gyorgy@0 109 }
gyorgy@0 110
gyorgy@0 111
gyorgy@0 112
gyorgy@0 113 // interface members
gyorgy@0 114 public function setSrc(url:String):void {
gyorgy@0 115 if (_isLoaded) {
gyorgy@0 116 // stop and restart
gyorgy@0 117 _video.pause();
gyorgy@0 118 }
gyorgy@0 119
gyorgy@0 120 _currentUrl = url;
gyorgy@0 121 }
gyorgy@0 122
gyorgy@0 123 public function load():void {
gyorgy@0 124 _video.load(_currentUrl);
gyorgy@0 125 _isLoaded =false;
gyorgy@0 126 }
gyorgy@0 127
gyorgy@0 128 public function play():void {
gyorgy@0 129
gyorgy@0 130 if (_isLoaded) {
gyorgy@0 131 _video.play();
gyorgy@0 132 _timer.start();
gyorgy@0 133 _isPaused = false;
gyorgy@0 134 _isLoaded = true;
gyorgy@0 135 sendEvent(HtmlMediaEvent.PLAYING);
gyorgy@0 136 } else {
gyorgy@0 137 // error: play() called without a URL
gyorgy@0 138 _video.play(_currentUrl);
gyorgy@0 139 _timer.start();
gyorgy@0 140 _isPaused = false;
gyorgy@0 141 _isLoaded = true;
gyorgy@0 142 sendEvent(HtmlMediaEvent.PLAYING);
gyorgy@0 143 }
gyorgy@0 144
gyorgy@0 145 }
gyorgy@0 146
gyorgy@0 147 public function pause():void {
gyorgy@0 148 _video.pause();
gyorgy@0 149 _isPaused = true;
gyorgy@0 150 _timer.stop();
gyorgy@0 151
gyorgy@0 152 _isPaused = true;
gyorgy@0 153 sendEvent(HtmlMediaEvent.PAUSED);
gyorgy@0 154 }
gyorgy@0 155
gyorgy@0 156 public function setCurrentTime(pos:Number):void {
gyorgy@0 157 _video.seek(pos);
gyorgy@0 158 sendEvent(HtmlMediaEvent.SEEKED);
gyorgy@0 159 }
gyorgy@0 160
gyorgy@0 161 public function setVolume(volume:Number):void {
gyorgy@0 162 _soundTransform = new SoundTransform(volume);
gyorgy@0 163 _video.soundTransform = _soundTransform;
gyorgy@0 164 _volume = volume;
gyorgy@0 165
gyorgy@0 166 _isMuted = (_volume == 0);
gyorgy@0 167
gyorgy@0 168 sendEvent(HtmlMediaEvent.VOLUMECHANGE);
gyorgy@0 169 }
gyorgy@0 170
gyorgy@0 171
gyorgy@0 172 public function setMuted(muted:Boolean):void {
gyorgy@0 173
gyorgy@0 174 if (_isMuted == muted)
gyorgy@0 175 return;
gyorgy@0 176
gyorgy@0 177 if (muted) {
gyorgy@0 178 _oldVolume = _video.soundTransform.volume;
gyorgy@0 179 setVolume(0);
gyorgy@0 180 } else {
gyorgy@0 181 setVolume(_oldVolume);
gyorgy@0 182 }
gyorgy@0 183
gyorgy@0 184 _isMuted = muted;
gyorgy@0 185 }
gyorgy@0 186
gyorgy@0 187
gyorgy@0 188 private function sendEvent(eventName:String) {
gyorgy@0 189
gyorgy@0 190 // calculate this to mimic HTML5
gyorgy@0 191 _bufferedTime = _bytesLoaded / _bytesTotal + _duration;
gyorgy@0 192
gyorgy@0 193 // build JSON
gyorgy@0 194 var values:String =
gyorgy@0 195 "{duration:" + _duration +
gyorgy@0 196 ",framerate:" + _framerate +
gyorgy@0 197 ",currentTime:" + _video.playheadTime +
gyorgy@0 198 ",muted:" + _isMuted +
gyorgy@0 199 ",paused:" + _isPaused +
gyorgy@0 200 ",ended:" + _isEnded +
gyorgy@0 201 ",volume:" + _volume +
gyorgy@0 202 ",bytesTotal:" + _bytesTotal +
gyorgy@0 203 ",bufferedBytes:" + _bytesLoaded +
gyorgy@0 204 ",bufferedTime:" + _bufferedTime +
gyorgy@0 205 "}";
gyorgy@0 206
gyorgy@0 207 _element.sendEvent(eventName, values);
gyorgy@0 208 }
gyorgy@0 209 }
gyorgy@0 210 }
gyorgy@0 211