Man kann Sound in die Bibliothek importieren und diesen dann in einem Schlüsselbild über das Eigenschaftenfenster starten und stoppen. Siehe dazu meine Sound Tipps unter Flash Basic.
In diesem Beispiel wird der Sound aus der Bibliothek per Actionscript eingefügt.
Der in die Bibliothek importierte Sound bekommt im folgenden Beispiel den Klassennamen "Kling". Dazu wähle aus dem Kontextmenüs des Sounds in der Bibliothek die Option "Eigenschaften" und aktiviere im Karteireiter "Actionscript" die Option "Export für Actionscript". Vergebe den Klassennamen, hier "Kling" Die Basisklasse ist "flash.media.Sound".
Über den Klassennamen kann man eine Instanz per Actionscript auf die Bühne bringen.
Die Methode play() hat 2 Parameter.
Start in Millisekunden. Das bedeutet, der Sound startet nicht am Anfang sondern beginnt nach der eingegebenen Millisekunden Anzahl.
Der zweite Parameter ist die Anzahl der Loops. Es ist nicht möglich einen Parameter für eine Endlosschleife einzugeben. Im übernächsten Beispiel folgt die Lösung des Problems.
var klingObj:Kling = new Kling(); klingObj.play();
Wenn man den Sound auch wieder stoppen will, braucht man eine Instanz der SoundChannel Klasse. Siehe Beispiel. Das Beispiel ist natürlich nicht praxistauglich, da der Sound gestartet und sofort wieder gestoppt wird.
import flash.media.Sound; import flash.media.SoundChannel; var cSound:China = new China(); var sndChnl:SoundChannel = new SoundChannel(); sndChnl = cSound.play(); sndChnl.stop();
Im folgendem Beispiel wird der Sound in einer Endlosschleife abgespielt. Über den Event SOUND_COMPLETE kann man das Ende des Abspielvorgangs überwachen.
var myDrum:Drum = new Drum(); var sndChnl:SoundChannel = new SoundChannel(); sndChnl = myDrum.play(); sndChnl.addEventListener(Event.SOUND_COMPLETE, soundEnde); function soundEnde(evt:Event):void { sndChnl = myDrum.play(); sndChnl.addEventListener(Event.SOUND_COMPLETE, soundEnde); }
Die Eigenschaft position der SoundChannel Klasse liefert die Position oder Zeit in Millisekunden, die seit dem Start des Sounds verstrichen ist. Darüber lässt sich eine Pause- Funktion programmieren.
var mySound:ChinaSound = new ChinaSound(); var sndChnl:SoundChannel = new SoundChannel(); var soundPosition:Number = 0; play_btn.addEventListener(MouseEvent.CLICK, soundPlay); function soundPlay(evt:MouseEvent):void { sndChnl = mySound.play(soundPosition); } pause_btn.addEventListener(MouseEvent.CLICK, soundStop); function soundStop(evt:MouseEvent):void { soundPosition = sndChnl.position; sndChnl.stop(); }
Das vorige Beispiel ist nicht ganz praxistauglich, da bei mehrmaligen klicken auf den Play Button der Sound mehrmals gleichzeitig abgespielt wird. Im folgenden Beispiel ist das Problem gelöst, indem der EventListener für den Abspielvorgang entfernt wird und erst nachdem man den Sound gestoppt hat wieder hinzugefügt wird.
var mySound:ChinaSound = new ChinaSound(); var sndChnl:SoundChannel = new SoundChannel(); var soundPosition:Number = 0; play_btn.addEventListener(MouseEvent.CLICK, soundPlay); function soundPlay(evt:MouseEvent):void { sndChnl = mySound.play(soundPosition); play_btn.removeEventListener(MouseEvent.CLICK, soundPlay); } pause_btn.addEventListener(MouseEvent.CLICK, soundStop); function soundStop(evt:MouseEvent):void { soundPosition = sndChnl.position; sndChnl.stop(); play_btn.addEventListener(MouseEvent.CLICK, soundPlay); }
Im folgenden Beispiel wurde ein Movieclip mit 2 Bildern in der Zeitleiste eingefügt. Im ersten Bild des Movieclips muss die Aktion stop(); eingefügt werden. Der MC dient als Play und Stop Button und bekommt den Instanznamen soundBtn. Damit lässt sich der Sound abpsielen und pausieren. Der Sound befindet sich in der Bilbliothek mit dem Klassennamen ChinaSound.
var mySound:ChinaSound = new ChinaSound(); var sndChnl:SoundChannel = new SoundChannel(); var soundPosition:Number = 0; soundBtn.addEventListener(MouseEvent.CLICK, soundPlay); function soundPlay(evt:MouseEvent):void { if (evt.currentTarget.currentFrame == 1) { sndChnl = mySound.play(soundPosition); sndChnl.addEventListener(Event.SOUND_COMPLETE, soundEnde); evt.currentTarget.gotoAndStop(2); } else { soundPosition = sndChnl.position; sndChnl.stop(); evt.currentTarget.gotoAndStop(1); } } function soundEnde(evt:Event):void { soundBtn.gotoAndStop(1); soundPosition = 0; }
Man kann eine mp3 Datei von außen in den Flashplayer laden. Dazu benötigt man eine Instanz der Soundklasse und eine Instanz der Klasse URLRequest.
import flash.media.Sound; import flash.net.URLRequest; var soundObj:Sound = new Sound(); var req:URLRequest = new URLRequest("kling.mp3"); soundObj.load(req); soundObj.play();
import flash.media.Sound; import flash.net.URLRequest; import flash.events.Event; var soundObj:Sound = new Sound(); var req:URLRequest = new URLRequest("klingdong.mp3"); soundObj.load(req); soundObj.addEventListener(Event.COMPLETE, loadComplete); function loadComplete(evt:Event):void { evt.currentTarget.play(); }
Im folgenden Beispiel wurde ein dynamisches Textfeld mit Instanznamen: info hinzugefügt. Wenn der Ladevorgang scheitert, wird dort die Information angezeigt.
var soundObj:Sound = new Sound(); var req:URLRequest = new URLRequest("klingdong.mp3"); soundObj.load(req); soundObj.addEventListener(Event.COMPLETE, loadComplete); function loadComplete(evt:Event):void { evt.currentTarget.play(); } soundObj.addEventListener(IOErrorEvent.IO_ERROR, loadError); function loadError(evt:IOErrorEvent):void { info.text = "Sound konnte nicht geladen werden."; }
Auch hier wird das dynamische Textfeld mit Instanznamen info genutzt. Nach dem Ladevorgang wird der Text entfernt.
import flash.media.Sound; import flash.net.URLRequest; import flash.events.Event; import flash.events.ProgressEvent; var soundObj:Sound = new Sound(); var req:URLRequest = new URLRequest("klingdong.mp3"); soundObj.load(req); soundObj.addEventListener(Event.COMPLETE, loadComplete); function loadComplete(evt:Event):void { evt.currentTarget.play(); info.text = ""; } soundObj.addEventListener(IOErrorEvent.IO_ERROR, loadError); function loadError(evt:IOErrorEvent):void { info.text = "Sound konnte nicht geladen werden."; } soundObj.addEventListener(ProgressEvent.PROGRESS, loadProgress); function loadProgress(evt:ProgressEvent):void { var geladen:Number = evt.bytesLoaded; var total:Number = evt.bytesTotal; var prozent:Number = Math.round((geladen/total)*100); info.text = "Sound wird geladen "+String(prozent)+" %"; }
Mit einem SoundLoaderContext Objekt kann man einen Streaming Sound laden. Die beiden Parameter bestimmten wieviel Millisekunden des Sounds geladen sein müssen, damit der Sound startet und der boolsche Parameter gibt an, ob die Domain, in der der Sound liegt auf eine Cross Domain Policy überprüft werden soll.
import flash.media.Sound; import flash.net.URLRequest; import flash.media.SoundLoaderContext; var soundObj:Sound = new Sound(); var req:URLRequest = new URLRequest("klingdong.mp3"); var context:SoundLoaderContext = new SoundLoaderContext(5000, false); soundObj.load(req, context); soundObj.play();
Hier wird ein Streaming Sound geladen und ein Laustärkewerte programmiert.
import flash.media.Sound; import flash.net.URLRequest; import flash.media.SoundChannel; import flash.media.SoundTransform; import flash.media.SoundLoaderContext; import flash.events.Event; var soundObj: Sound = new Sound(); var req: URLRequest = new URLRequest("Menuet.mp3"); var context: SoundLoaderContext = new SoundLoaderContext(5000, false); var sndCh: SoundChannel = new SoundChannel(); var trans: SoundTransform = new SoundTransform(); trans.volume = 0.2; soundObj.load(req, context); soundObj.addEventListener(Event.COMPLETE, loadComplete); function loadComplete(evt: Event): void { sndCh = soundObj.play(); //die Reihenfolge ist wichtig sndCh.soundTransform = trans; }
Hierzu braucht man 2 Schaltflächen Instanzen mit den Instanznamen play_btn und pause_btn. Weiter unten sind noch die Actions für 2 Slider Komponeneten eingebaut. Sie haben die Insanznamen volSlider und panSlider. Beachte, auch die erforderliche Import Anweisung für den Slider Event. import fl.events.SliderEvent;
var soundObj: Sound = new Sound(); var req: URLRequest = new URLRequest("Menuet.mp3"); var context: SoundLoaderContext = new SoundLoaderContext(5000, false); var sndCh: SoundChannel = new SoundChannel(); var trans: SoundTransform = new SoundTransform(); trans.volume = 0.5; var pausePosition: int; soundObj.load(req, context); soundObj.addEventListener(Event.COMPLETE, loadComplete); function loadComplete(evt: Event): void { play_btn.addEventListener(MouseEvent.CLICK, playSound); pause_btn.addEventListener(MouseEvent.CLICK, pauseSound); } function playSound(evt: MouseEvent) { pausePosition = sndCh.position; sndCh.stop(); sndCh = soundObj.play(pausePosition); //Reihenfolge beachten für Lautstärke sndCh.soundTransform = trans; } function pauseSound(evt: MouseEvent) { pausePosition = sndCh.position; sndCh.stop(); } //-------------------Slider Komponente-------- import fl.events.SliderEvent; volSlider.addEventListener(SliderEvent.CHANGE, setVol); panSlider.addEventListener(SliderEvent.CHANGE, setPan); function setVol(evt:Event):void { trans.volume = evt.currentTarget.value; sndCh.soundTransform = trans; } function setPan(evt:Event):void { trans.pan = evt.currentTarget.value; sndCh.soundTransform = trans; }
Auch in diesem Beispiel wird der Sound aus der Bibliothek hinzugefügt. Mit der Slider Komponente wird die Lautstärke geregelt. Wenn man dieses Beispiel noch um eine Stop und Play Button erweitert, sollte man den Slider unsichtbar machen, sofern der Sound gestoppt ist.
Hier werden mp3 Dateien geladen. Mittels Buttons kann man die Sounds steuern. Ich habe mir dazu eine Klasse erzeugt.
Hier die Klasse SoundStopPlay
package { import flash.media.Sound; import flash.media.SoundChannel; import flash.net.URLLoader; import flash.net.URLRequest; public class SoundStopPlay { private var snd:Sound = new Sound(); private var channel:SoundChannel = new SoundChannel(); private var pausePosition:int; public function SoundStopPlay(_req:String) { var req:URLRequest=new URLRequest(_req); snd.load(req); } public function stopSound():void { pausePosition=channel.position; channel.stop(); } public function playSound():void { pausePosition=channel.position; channel.stop(); channel=snd.play(pausePosition); } public function startSound():void { pausePosition=channel.position; channel.stop(); channel=snd.play(0); } } }