Simple Freeware OpenSource Flex Player for Web (one sound).
To view this page ensure that Adobe Flash Player version 10.0.0 or greater is installed.
В прошлом году мне опять попался проект с флеш-плеером (http://releasebeat.vb-net.com/). Я сделал этот непростой проект на ASP.NET полностью за вычетом одной малости - согласно нашей договоренности - заказчик сайта должен был флеш-плеер заказывать самостоятельно на стороне (ибо в 2010-м году я неготов был тратить свое время неэффективно и писать на флеше лично). Первая дефка-флешерша (как оказалось) умеет делать только верстки на флеше и добавить Sound.play на кнопку ей было уже не по силам. Потом заказчик нашел нужный ему у другого флешера плеер за 30 тысяч и за месяц работы, потом за 20 тысяч и за две недели, потом нашел какого-то третьего флешера. Потом появился четвертый. Он перевел предоплату сначала одному флешеру, потом другому, потом начал договариваться с третьим. И с каждым флешером мне пришлось общаться, обьяснять им специфический интерфейс между сайтом и плеером. На очередном флешере (который так ничего и не сделал) - мое терпение от общения с флешерами лопнуло. Я описал письменно интерфейс между сайтом и плеером и четветому флешеру я отдал описание и весь сайт целиком с тестовым плеером (который я тупо скачал из инета и на котором отлаживал сайт). Этот проект был для меня той самой последней каплей, после которой я понял - делать сайты под ключ и надеятся на каких-то левых привлеченных людей, которые будут (или не будут) делать мега-важные компоненты любого сайта - так жить нельзя. Тем более это был уже наверное 20-й мой проект в котором я уперся в собственную тупость и неумение программировать на флеше. Я поднапрягся и с начала 2011-го года стал все больше и больше программировать на флеше - пока не добился беглого программирования на флеше почти с той же скоростью, как и на бейсике.
И вот результат перед вами. Это уже примерно мой пятидесятый проект на флеше (кое что из написанного за этот год я успел описать здесь. И этот Freeware OpenSource плеер я написал за одну неполную субботу (ну еще немного времени я потратил в воскресенье чтобы сделать это описние. Для сравнения - только на общение с тремя идиотами-флешерами в вышеописанном прошлогоднем проекте (которые по факту оказались все просто пустым местом) я потратил втрое больше времени. Ну я уже молчу про разницу в ощущениях от жизни - когда ты высшая форма человека разумного - программист и творец (и создаешь вот такие конфетки как этот плеер или другие мои проги) либо ты тратишь свое время на общение с пустым местом.
В процессе написания (поскольку времени я смог выделить оооочень мало) - я не стал писать адский универсальный плеер на все случаи жизни. Я сделал то, что успел сделать за один день - воспроизведение ОДНОГО аудио-ролика (справедливости ради заметим что это покрывает 90% потребностей в плеерах).
Но голова у меня беременна уже на десять плееров, например плеер - 600 слов из букваря Баррона. В голове вертится код AIR-приложения по типу VLC или Windows Media Player - которые в базе на SQLite запоминают расположения роликов на кампутере и потом можно просто открыть табличку и кликать по локейшенам роликов для вопроизведения. Можно сделать плееры с динамически настраиваемыми стилями, с натягиваемыми пользователями плеера скинами. Ну рассказывать все идеи пока не буду - голову просто рвет от плееров разной направленности. Будет еще свободное время - выложу еще пару-тройку Freeware OpenSource плееров, заточенных под разные задачи.
Итак, о коде. Поскольку времени было совсем мало - я не стал писать собственный визуализатор - а скачал визуализатор отсюда. Фактически взял первый попавшийся готовый OpenSource визуализатор, который нашел в гугле. Посмотрел как он управляется и прикрутил его к проекту. В принципе визуализатор Ben Stucki имеет кучу параметров - я мог бы их вытащить хотя бы в FlashVars или в управляющий XML. Можно было бы сделать управляемым хотя бы цвет плеера - но времени просто не хватило. Этот Freeware OpenSource плеер соответствует своему названию SIMPLE - то есть простой предельно: он белого цвета, умеет вопросизводить только один аудио-ролик, управлять эффектами из параметров нельзя, линейка с длительностью вопроизведения некликабельна, скины натягивать нельзя. Ну собственно нельзя практически ничего. Это с одной стороны плохо, но с другой стороны это БАЗОВЫЙ ШАБЛОН КОДА ПЛЕЕРА - шаблон который можно развивать с ЛЮБУЮ сторону.
Позиционирование я сначала хотел сделать относительное, чтобы плеер можно было масштабировать (примерно так - Как с помощью jQuery сделать флеш-ролик резиновым) - но потом я понял что времени не хватит закончить этот проект до вечера и сделал плеер фиксированного размера (но вам никто не мешает поменять размеры в дизайн-тайме). Поэтому вы можете видеть смешанную верстку - что-то спозиционировано аккуратно и относительно, потом вдруг что-то немотивированно спозиционировано абсолютно.
ID3 теги по полной программе протестировать я не успел. Слишком мало было у меня времени. Но первые пять точно работают (проверено), остальные (определенные в стандарте) - не уверен.
Ну вот вроде бы и все комментарии к моему коду:
1: <?xml version="1.0" encoding="utf-8"?>
2: <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
3: xmlns:s="library://ns.adobe.com/flex/spark"
4: xmlns:xx="com.fusiox.ui.*"
5: xmlns:mx="library://ns.adobe.com/flex/mx"
6: minWidth="620" minHeight="300" width="620" height="300"
7: applicationComplete="application1_applicationCompleteHandler(event)" backgroundColor="#FDF5E6">
8:
9: <fx:Script>
10: <![CDATA[
11: import flash.events.TimerEvent;
12: import flash.filters.BlurFilter;
13: import flash.media.Sound;
14: import flash.media.SoundLoaderContext;
15: import flash.media.SoundMixer;
16: import flash.net.URLLoader;
17: import flash.net.URLRequest;
18: import mx.controls.Alert;
29: import mx.effects.easing.Linear;
20: import mx.events.FlexEvent;
21:
22:
23: [Bindable]
24: public var effects:Array = new Array();
25:
26: private var Sound1:Sound;
27: private var SoundChannel1:SoundChannel;
28: private var SoundTranform1:SoundTransform;
29: private var Timer1:Timer = new Timer(50);
30: private var PausePosition:int;
31: private var params:Object;
32:
33: private var LoadTotal:int;
34: private var LoadCurrent:int;
35: private var PlayTotal:int;
36: private var PlayCurrent:int;
37:
38: protected function application1_applicationCompleteHandler(event:FlexEvent):void
39: {
40: flash.media.SoundMixer.stopAll();
41: SoundLocation.mask = SoundLocation_Mask;
42: SoundID.mask = SoundID_Mask;
43:
44: var LineColor:int=204;
45: var FillColor:int=255;
46:
47: effects.push(new Array("verticalBlur", verticalBlur));
48: effects.push(new Array("horizontalBlur", horizontalBlur));
49: effects.push(new Array("verticalScroll", verticalScroll));
50: effects.push(new Array("horizontalScroll", horizontalScroll));
51: effects.push(new Array("blueFade", blueFade));
52:
53: VisualPanel.setStyle("audioLineColor",LineColor);
54: VisualPanel.setStyle("audioFillColor",FillColor);
55: VisualPanel.addEventListener("beforeVisualization", effects[2][1]);
56: VisualPanel.addEventListener("afterVisualization", effects[3][1]);
57:
58:
59: params = mx.core.FlexGlobals.topLevelApplication.parameters;
60: if (!params.hasOwnProperty("SoundUrl")) {
61: // http://www.benstucki.net/mp3/tech_talk.mp3
62: Alert.show("flashvars parameters 'SoundUrl' not set.");
63: return;
64: }
65: else
66: {
67: SoundID.htmlText=params.SoundUrl;
68: PlayOneSound(params.SoundUrl);
69: }
70: }
71:
72:
73: private function PlayOneSound(SoundURL:String):void{
74:
75: var Request1:URLRequest = new URLRequest(SoundURL);
76: var Loader1:URLLoader = new URLLoader(Request1);
77: Loader1.addEventListener(ProgressEvent.PROGRESS, UpdateProgress);
78: Loader1.addEventListener(Event.COMPLETE, CompleteProgress);
79:
80: Sound1 = new Sound();
81:
82: Sound1.addEventListener(Event.COMPLETE, SoundComplete_Handler)
83: Sound1.addEventListener(IOErrorEvent.IO_ERROR,IOError_Handler);
84: Sound1.addEventListener(Event.ID3, ID3_Handler);
85: Sound1.addEventListener(Event.OPEN,SoundOpen_Handler);
86: Sound1.addEventListener(ProgressEvent.PROGRESS,SoundProgress_Handler);
87: Sound1.addEventListener(SampleDataEvent.SAMPLE_DATA,SampleData_Handler);
88:
89: Sound1.load(Request1);
90:
91: SoundChannel1 = Sound1.play();
92: SoundChannel1.soundTransform = new SoundTransform (VolumeLevel.value, BallansLevel.value);
93:
94: Timer1.addEventListener(TimerEvent.TIMER, onTimer);
95: Timer1.start();
96:
97: ID3_marquee.duration = 30 * SoundID.width;
98: ID3_marquee.xFrom = SoundID.width;
99: ID3_marquee.xTo = -SoundID.width;
100: ID3_marquee.play();
101:
102: AlertMessage(SoundURL);
103: }
104:
105: private function AlertMessage(Message:String) :void{
106: SoundLocation.text=Message;
107: URL_marquee.duration = 30 * SoundLocation.width;
108: URL_marquee.repeatCount=1;
109: URL_marquee.xFrom = SoundLocation.width;
110: URL_marquee.xTo = -SoundLocation.width;
111: URL_marquee.play();
112: }
113:
114: private function SoundOpen_Handler (e:Event):void{
115: //load operation starts
116: //AlertMessage ("SoundOpen:");
117: }
118:
119: private function SoundComplete_Handler (e:Event):void{
120: //data has loaded successfully
121: //AlertMessage("SoundComplete");
122: }
123:
124: private function IOError_Handler (e:Event):void{
125: //input/output error occurs that causes a load operation to fail.
126: AlertMessage("IOError")
127: }
128:
129: private function ID3_Handler (e:Event):void{
130: //Sound ID3
131: SoundID.htmlText="";
132: Add_ID3_Tag(Sound1.id3.album); //TALB
133: Add_ID3_Tag(Sound1.id3.artist); //TPE1
134: Add_ID3_Tag(Sound1.id3.comment); //COMM
135: Add_ID3_Tag(Sound1.id3.genre); //TCON
136: Add_ID3_Tag(Sound1.id3.songName);//TIT2
137: Add_ID3_Tag(Sound1.id3.track); //TRCK
138: Add_ID3_Tag(Sound1.id3.year); //TYER
139: Add_ID3_Tag(Sound1.id3.TFLT);
140: Add_ID3_Tag(Sound1.id3.TIME);
141: Add_ID3_Tag(Sound1.id3.TIT1);
142: Add_ID3_Tag(Sound1.id3.TIT3);
143: Add_ID3_Tag(Sound1.id3.TKEY);
144: Add_ID3_Tag(Sound1.id3.TLAN);
145: Add_ID3_Tag(Sound1.id3.TLEN);
146: Add_ID3_Tag(Sound1.id3.TMED);
147: Add_ID3_Tag(Sound1.id3.TOAL);
148: Add_ID3_Tag(Sound1.id3.TOFN);
149: Add_ID3_Tag(Sound1.id3.TOLY);
150: Add_ID3_Tag(Sound1.id3.TOPE);
151: Add_ID3_Tag(Sound1.id3.TORY);
152: Add_ID3_Tag(Sound1.id3.TOWN);
153: Add_ID3_Tag(Sound1.id3.TPE2);
154: Add_ID3_Tag(Sound1.id3.TPE3);
155: Add_ID3_Tag(Sound1.id3.TPE4);
156: Add_ID3_Tag(Sound1.id3.TPOS);
157: Add_ID3_Tag(Sound1.id3.TPUB);
158: Add_ID3_Tag(Sound1.id3.TRDA);
159: Add_ID3_Tag(Sound1.id3.TRSN);
160: Add_ID3_Tag(Sound1.id3.TRSO);
161: Add_ID3_Tag(Sound1.id3.TSIZ);
162: Add_ID3_Tag(Sound1.id3.TSRC);
163: Add_ID3_Tag(Sound1.id3.TSSE);
164: Add_ID3_Tag(Sound1.id3.WXXX);
165: }
166:
167: private function Add_ID3_Tag (tag:Object):void{
168: if (tag != null){
169: if (tag != ""){
170: SoundID.htmlText += " " + tag.toString();
171: }
172: } }
173:
174: private function SoundProgress_Handler (e:Event):void{
175: //data is received as a load operation progresses
176: //trace ("SoundProgress: LoadTotal=" + LoadTotal + ", LoadCurrent=" + LoadCurrent+ ", PlayTotal=" + Sound1.length + ", PlayCurrent=" + SoundChannel1.position);
177: }
178:
179: private function SampleData_Handler (e:Event):void{
180: //player requests new audio data
181: //AlertMessage("requests new audio data")
182: }
183:
184: private function UpdateProgress(e:ProgressEvent ):void {
185: //trace ("UpdateProgress: Total=" + e.bytesTotal + ", Loaded=" + e.bytesLoaded);
186: LoadTotal=e.bytesTotal;
187: LoadCurrent=e.bytesLoaded;
188: }
189:
190: public function onTimer(event:TimerEvent):void {
191: //trace ("onTimer: LoadTotal=" + LoadTotal + ", LoadCurrent=" + LoadCurrent+ ", PlayTotal=" + Sound1.length + ", PlayCurrent=" + SoundChannel1.position);
192: PlayTotal = Sound1.length;
193: PlayCurrent = SoundChannel1.position;
194: SetProgressInfo();
195: if (PlayTotal==PlayCurrent && PlayTotal!=0 && PlayCurrent!=0){
196: //ролик завершен
197: LoadProgress.label="";
198: SoundLocation.text="";
199: SoundID.htmlText="";
200: ID3_marquee.stop();
201: URL_marquee.stop();
202: Timer1.stop();
203: }
204: }
205:
206: private function CompleteProgress( e:Event ):void {
207: //AlertMessage("CompleteProgress")
208: }
209:
210: private function blueFade( e:Event ):void {
211: e.target.bitmapData.colorTransform( e.target.bitmapData.rect, new ColorTransform( 0.6, 0.8, 1, 0.9 ) );
212: }
213:
214: private function verticalBlur( e:Event ):void {
215: e.target.bitmapData.applyFilter( e.target.bitmapData, e.target.bitmapData.rect, new Point(0,0), new BlurFilter(0,15));
216: }
217:
218: private function horizontalBlur( e:Event ):void {
219: e.target.bitmapData.applyFilter( e.target.bitmapData, e.target.bitmapData.rect, new Point(0,0), new BlurFilter(15,0));
220: }
221:
222: private function verticalScroll( e:Event ):void {
223: e.target.bitmapData.scroll(0,5);
224: }
225:
226: private function horizontalScroll( e:Event ):void {
227: e.target.bitmapData.scroll(-5,0);
228: }
229:
230: private function SetProgressInfo():void{
231: PlayProgress.label="";
232: if (LoadTotal!=0 && (PlayTotal==0 || PlayCurrent==0) ){
233: LoadProgress.label = "Load " + Math.ceil(LoadCurrent/LoadTotal*100) + "% ";
234: LoadProgress.setProgress(LoadCurrent,LoadTotal);
235: }
236: else if (PlayTotal!=0 && PlayCurrent!=0 && LoadCurrent==LoadTotal ){
237: LoadProgress.label = "Play " + Math.ceil(PlayCurrent/PlayTotal*100) + "% ";
238: PlayProgress.setProgress(PlayCurrent,PlayTotal);
239: }
240: else if (PlayTotal!=0 && LoadTotal!=0 && LoadCurrent!=LoadTotal && PlayCurrent!=PlayTotal){
241: LoadProgress.label = "Load " + Math.ceil(LoadCurrent/LoadTotal*100) + "% " + "Play " + Math.floor(PlayCurrent/PlayTotal*100) + "% ";
242: LoadProgress.setProgress(LoadCurrent,LoadTotal);
243: PlayProgress.setProgress(PlayCurrent,PlayTotal);
244: }
245: }
246:
247: protected function VolumeLevel_changeHandler(event:Event):void
248: {
249: SoundTranform1 = new SoundTransform (VolumeLevel.value, BallansLevel.value);
250: SoundChannel1.soundTransform = SoundTranform1;
251: }
252:
253: protected function BallansLevel_changeHandler(event:Event):void
254: {
255: SoundTranform1 = new SoundTransform (VolumeLevel.value, BallansLevel.value);
256: SoundChannel1.soundTransform = SoundTranform1;
257: }
258:
259: protected function PlayButton_clickHandler(event:MouseEvent):void
260: {
261: SoundChannel1=Sound1.play(PausePosition);
262: SoundTranform1 = new SoundTransform (VolumeLevel.value, BallansLevel.value);
263: SoundChannel1.soundTransform = SoundTranform1
264: PlayButton.enabled = false;
265: PauseButton.enabled=true;
266: }
267:
268: protected function PauseButton_clickHandler(event:MouseEvent):void
269: {
270: PausePosition = SoundChannel1.position;
271: SoundChannel1.stop();
272: PauseButton.enabled=false;
273: PlayButton.enabled = true;
274: }
275:
276: protected function RewindButton_clickHandler(event:MouseEvent):void
277: {
278: //рестарт ролика без перезагрузки c URL
279: PausePosition=0;
280: SoundChannel1.stop();
281: SoundChannel1 = Sound1.play();
282: SoundTranform1 = new SoundTransform (VolumeLevel.value, BallansLevel.value);
283: SoundChannel1.soundTransform = SoundTranform1
284: PlayButton.enabled = false;
285: PauseButton.enabled=true;
286: Timer1.start();
287: ID3_marquee.play();
288: }
289: ]]>
290: </fx:Script>
291:
292: <fx:Declarations>
293: <!-- Декларативное определение TWEEN-анимации -->
294: <mx:Move id="ID3_marquee" target="{SoundID}" repeatCount="0" easingFunction="mx.effects.easing.Linear.easeIn" />
295: <mx:Move id="URL_marquee" target="{SoundLocation}" repeatCount="1" easingFunction="mx.effects.easing.Linear.easeIn" />
296: </fx:Declarations>
297:
298: <mx:Panel width="600" height="265" y="10" borderVisible="true" enabled="true" headerHeight="20" title="Simple Freeware OpenSource Flex Player for Web (one sound) - //www.vb-net.com/" x="10">
299: <s:HGroup width="500" height="240" gap="10" verticalCenter="0" verticalAlign="top" x="0">
300: <s:VGroup width="90%" height="200" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5" horizontalAlign="center">
301: <s:BorderContainer width="485" height="150" borderVisible="false">
302: <xx:Visualization id="VisualPanel" type="wave" bars="32" width="485" height="150" />
303: <mx:Label id="SoundID" width="485" fontSize="14" />
304: <s:BorderContainer id="SoundID_Mask" x="0" y="0" width="485" height="24" />
305: <s:Label id="SoundLocation" x="4" y="137" width="100%"/>
306: <s:BorderContainer id="SoundLocation_Mask" x="0" y="137" width="485" height="12" />
307: </s:BorderContainer>
308: <s:BorderContainer width="485" height="40" borderVisible="false">
309: <mx:ProgressBar id="LoadProgress" width="485" mode="manual" chromeColor="#313131" z="2" label="" fontStyle="italic" fontWeight="normal" fontAntiAliasType="advanced" fontSize="12"/>
310: <mx:ProgressBar id="PlayProgress" width="485" mode="manual" alpha="0.5" z="1" label=""/>
311: </s:BorderContainer>
312: <s:HGroup width="100%" height="30" gap="20" paddingLeft="5" paddingRight="0">
313: <s:Button label="Play" width="150" cornerRadius="5" id="PlayButton" click="PlayButton_clickHandler(event)" enabled="false"/>
314: <s:Button label="Pause" width="150" cornerRadius="5" id="PauseButton" click="PauseButton_clickHandler(event)"/>
315: <s:Button label="Rewind" width="150" cornerRadius="5" id="RewindButton" click="RewindButton_clickHandler(event)"/>
316: </s:HGroup>
317: </s:VGroup>
318: <s:VGroup width="100%" height="100%">
319: <mx:VRule height="20" visible="false"/>
320: <s:HGroup width="100%" paddingLeft="5">
321: <s:VGroup width="100%" height="100%">
322: <s:VSlider id="VolumeLevel" x="644" y="21" height="180" minimum="0" maximum="1" stepSize="0.01" value="0.5" change="VolumeLevel_changeHandler(event)"/>
323: <s:Label text="Vol" fontSize="14"/>
324: </s:VGroup>
325: <mx:HRule width="5" visible="false"/>
326: <s:VGroup width="100%" height="100%">
327: <s:VSlider id="BallansLevel" x="644" y="318" height="180" minimum="-1" maximum="1" stepSize="0.1" value="0" change="BallansLevel_changeHandler(event)"/>
328: <s:Label text="Bal" fontSize="14"/>
329: </s:VGroup>
330: </s:HGroup>
331: </s:VGroup>
332: </s:HGroup>
333:
334: </mx:Panel>
335: </s:Application>
URL аудио-ролика при вызове плеера указывается в параметре SoundUrl:
1: <head>
2: ...
3: <style type="text/css" media="screen">
4: html, body { height:100%; }
5: body { margin:0; padding:0; overflow:auto; text-align:center;
6: background-color: #fdf5e6; }
7: object:focus { outline:none; }
8: #flashContent { display:none; }
9: </style>
10:
11: <!-- Enable Browser History by replacing useBrowserHistory tokens with two hyphens -->
12: <!-- BEGIN Browser History required section -->
13: <link rel="stylesheet" type="text/css" href="history/history.css" />
14: <script type="text/javascript" src="history/history.js"></script>
15: <!-- END Browser History required section -->
16:
17: <script type="text/javascript" src="swfobject.js"></script>
18: <script type="text/javascript">
19: <!-- For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. -->
20: var swfVersionStr = "10.0.0";
21: <!-- To use express install, set to playerProductInstall.swf, otherwise the empty string. -->
22: var xiSwfUrlStr = "playerProductInstall.swf";
23: var flashvars = {};
24: flashvars.SoundUrl="//www.vb-net.com/flex11/0001.WAV";
25: var params = {};
26: params.quality = "high";
27: params.bgcolor = "#fdf5e6";
28: params.allowscriptaccess = "sameDomain";
29: params.allowfullscreen = "true";
30: var attributes = {};
31: attributes.id = "AudioPlayer_Web";
32: attributes.name = "AudioPlayer_Web";
33: attributes.align = "middle";
34: swfobject.embedSWF(
35: "AudioPlayer_Web.swf", "flashContent",
36: "620", "300",
37: swfVersionStr, xiSwfUrlStr,
38: flashvars, params, attributes);
39: <!-- JavaScript enabled so display the flashContent div in case it is not replaced with a swf object. -->
40: swfobject.createCSS("#flashContent", "display:block;text-align:left;");
41: </script>
42: </head>
43: <body>
44: ...
45: <div id="flashContent">
46: <p>
47: To view this page ensure that Adobe Flash Player version
48: 10.0.0 or greater is installed.
49: </p>
50: <script type="text/javascript">
51: var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://");
52: document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='"
53: + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" );
54: </script>
55: </div>
56:
57: <noscript>
58: <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="620" height="300" id="AudioPlayer_Web">
59: <param name="movie" value="AudioPlayer_Web.swf" />
60: <param name="quality" value="high" />
61: <param name="bgcolor" value="#fdf5e6" />
62: <param name="allowScriptAccess" value="sameDomain" />
63: <param name="allowFullScreen" value="true" />
64: <!--[if !IE]>-->
65: <object type="application/x-shockwave-flash" data="AudioPlayer_Web.swf" width="620" height="300">
66: <param name="FlashVars" value="SoundUrl='//www.vb-net.com/flex11/0001.WAV'"/>
67: <param name="quality" value="high" />
68: <param name="bgcolor" value="#fdf5e6" />
69: <param name="allowScriptAccess" value="sameDomain" />
70: <param name="allowFullScreen" value="true" />
71: <!--<![endif]-->
72: <!--[if gte IE 6]>-->
73: <p>
74: Either scripts and active content are not permitted to run or Adobe Flash Player version
75: 10.0.0 or greater is not installed.
76: </p>
77: <!--<![endif]-->
78: <a href="http://www.adobe.com/go/getflashplayer">
79: <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash Player" />
80: </a>
81: <!--[if !IE]>-->
82: </object>
83: <!--<![endif]-->
84: </object>
85: </noscript>
86: ...
87: </body>
Посмотреть всякие другие интересные штучки на флеше - на описание которых у меня хватило времени - можно здесь - Flex-программирование. Сгрузить этот плеер в готовом откомпилированном виде можно отсюда Simple Flex Player for Web (one sound).
Вы можете посмотреть еще мою заметку на видеотематику - Видео-камеры, видео-чаты и Flash-медиасервера (работающие по RTMP и самописным протоколам).
<SITEMAP> <MVC> <ASP> <NET> <DATA> <KIOSK> <FLEX> <SQL> <NOTES> <LINUX> <MONO> <FREEWARE> <DOCS> <ENG> <CHAT ME> <ABOUT ME> < THANKS ME> |