(Flex) Flex (2011 год)

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 и самописным протоколам).




Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17>  <18>  <19>  <20>  <21>  <22>  <23
Link to this page: //www.vb-net.com/Simple-Flex-Music-Player/index.htm
<SITEMAP>  <MVC>  <ASP>  <NET>  <DATA>  <KIOSK>  <FLEX>  <SQL>  <NOTES>  <LINUX>  <MONO>  <FREEWARE>  <DOCS>  <ENG>  <CHAT ME>  <ABOUT ME>  < THANKS ME>