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
|