Zurück   Flashforum > Flash > ActionScript > ActionScript 2

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 13-11-2010, 20:49   #1 (permalink)
Neuer User
 
Registriert seit: Nov 2010
Beiträge: 4
as2, xml einlesen, mp3s in flash laden, und per externalinterface abspielen

Hallo Community,
bin neu hier, folglich mein erster Post..

Bin jetzt schon seit fast 5 Stunden am rumprobieren, aber komme auf kein brauchbares Ergebnis..

Muss dazu noch sagen, hab grad mit Flash (AS) angefangen! Also kann man da noch nicht so viel von mir erwarten ;-)

Geht um ein kleines Flash (Version 8 mit AS2) für eine Website, welches kurze Sounds (mp3's / wave's) aus einer xml lesen soll und dann direkt in die Flash läd, damit man sie per JavaScript (ExternalInterface.addCallback) direkt abspielen kann, ohne das da noch großartig was nachgeladen werden muss..


Hier erstmal der Inhalt der xml (sounds.xml):
Code:
<?xml version="1.0" encoding="utf-8"?>
<sounds>
	<sound sound_id="sound_01" sound_file="sounds/sound1.mp3"/>
	<sound sound_id="sound_02" sound_file="sounds/sound2.mp3"/>
	<sound sound_id="sound_03" sound_file="sounds/sound3.mp3"/>
	<sound sound_id="sound_04" sound_file="sounds/sound4.mp3"/>
	<sound sound_id="sound_05" sound_file="sounds/sound5.mp3"/>
</sounds>
Und hier das ActionScript aus dem ersten Frame:
Code:
stop();

var XMLdata = new XML();
XMLdata.ignoreWhite=true;
XMLdata.load("sounds.xml");
XMLdata.onLoad = function(success){
	var amount = XMLdata.firstChild.childNodes.length;
	for(var i=0; i<amount; i++){
			sound_id = XMLdata.firstChild.childNodes[i].attributes.sound_id;
			sound_file = XMLdata.firstChild.childNodes[i].attributes.sound_file;
			this[sound_id] = new Sound();
			this[sound_id].loadSound(sound_file, false);
			
			ExternalInterface.addCallback("play_"+this[sound_id], this[sound_id].start());
	}
}
Hatte mir den Inhalt der xml im Flash schonmal als Text ausspucken lassen, um zu schauen ob da überhaupt was passiert.. folglich kann man davon ausgehen, dass das Einlesen nicht das Problem ist.. doch danach kommt dann iwo das Problem..

Hoffe ich bin kein hoffnungsloser Fall und ihr könnt mir helfen

thx
Brian Miller ist offline   Mit Zitat antworten
Alt 14-11-2010, 10:19   #2 (permalink)
brand new user
 
Benutzerbild von RustyCake
 
Registriert seit: May 2002
Ort: Laimbach 6 1/2
Beiträge: 16.884
Kann mich jetzt auch täuschen, eaber soweit ich gelesen hab, ist "ExternalInterface" erst ab ActionScript 3 verfügbar!
__________________
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muß erst gehen lernen"
RustyCake ist offline   Mit Zitat antworten
Alt 14-11-2010, 10:53   #3 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Versuch's mal mit:
PHP-Code:
ExternalInterface.addCallback("play_"+sound_idthis[sound_id], this[sound_id].start); 
Mehr dazu in der Hilfe.


@RustyCake:
Zitat:
Zitat von RustyCake Beitrag anzeigen
Kann mich jetzt auch täuschen, eaber soweit ich gelesen hab, ist "ExternalInterface" erst ab ActionScript 3 verfügbar!
Da täuschst Du Dich! ExternalInterface gibt es seit FP8 / AS1.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (14-11-2010 um 10:55 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 14-11-2010, 11:10   #4 (permalink)
brand new user
 
Benutzerbild von RustyCake
 
Registriert seit: May 2002
Ort: Laimbach 6 1/2
Beiträge: 16.884
OK.

Hab mich an den Link von Adobe gehalten

flash.external.ExternalInterface (ActionScript 3.0)
__________________
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muß erst gehen lernen"
RustyCake ist offline   Mit Zitat antworten
Alt 14-11-2010, 11:21   #5 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von RustyCake Beitrag anzeigen
Hab mich an den Link von Adobe gehalten
flash.external.ExternalInterface (ActionScript 3.0)
Es gibt sinnvollerweise getrennte Referenzen für AS1/2 und AS3. Und in der AS3-Referenz steht natürlich selbst bei den ältesten Klassen folgende Mindestanforderung:
Zitat:
Sprachversion : ActionScript 3.0
Player-Version : Flash Player 9
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (14-11-2010 um 13:01 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 15-11-2010, 09:40   #6 (permalink)
Neuer User
 
Registriert seit: Nov 2010
Beiträge: 4
Guten Morgen, und danke für die vielen Antworten

habs mit..
Code:
ExternalInterface.addCallback("play_"+sound_id, this[sound_id], this[sound_id].start);
..versucht, nur leider ohne erfolg.

Kann es sein, dass meine for Schleife das Problem ist? Bzw das einladen der mp3 dateien? Die xml wird ja korrekt eingelesen, denn 'id' und 'file' als Text auszuspucken klappt ja.. nur iwie scheinen die generierten Variablen dann leer zu sein (kein Sound drinne)..

Wenn ich direkt das..
Code:
sound_01 = new Sound();
sound_01.loadSound("sounds/sound1.mp3", false);
sound_01.start();
..eingebe (ohne Schleife etc), klappts! ja eig klar..

Aber wenn ich dann das mache..
Code:
sound_01 = new Sound();
sound_01.loadSound("sounds/sound1.mp3", false);
ExternalInterface.addCallback("play_sound_01", sound_01, sound_01.start);
..gehts nicht

und wenn ich die schleife laufen lasse, und dann nach der Schleife einfach "sound_01.start();" sage, gehts auch nicht..

..iwie ist da der Worm drinne, kanns sein das es vielleicht doch dran liegt das ich es als Flash8 in As2 exportiere?

nur wenn ich auf Flash9/10 + As3 gehe, ist das ganze ActionScript ein einziger Fehler beim exportieren..

thx
Brian Miller ist offline   Mit Zitat antworten
Alt 15-11-2010, 09:58   #7 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von Brian Miller Beitrag anzeigen
und wenn ich die schleife laufen lasse, und dann nach der Schleife einfach "sound_01.start();" sage, gehts auch nicht..
Du kannst einen Sound natürlich erst dann abspielen, wenn er geladen wurde! Befehle, die auf dieses Ereignis warten sollen, schreibst Du am Besten in die Callback-Funktion onload!

Mal ein ganz anderer Gedanke:
Wieso lädst Du eigentlich alle Sounds vor? Lad' doch immer nur den, der gerade über ExternalInterface aufgerufen wird und spiel ihn direkt ab!

Zitat:
Zitat von Brian Miller Beitrag anzeigen
... dran liegt das ich es als Flash8 in As2 exportiere?
nur wenn ich auf Flash9/10 + As3 gehe, ist das ganze ActionScript ein einziger Fehler beim exportieren..
Nein, ein Script ist entweder AS1/2 oder AS3! Einfach die Exporteinstellungen ändern, bringt da nix!
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (15-11-2010 um 10:00 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 15-11-2010, 16:09   #8 (permalink)
Neuer User
 
Registriert seit: Nov 2010
Beiträge: 4
Problem gelöst nur das callBack muss ich jetzt noch zum laufen bringen.. aber das kann ich erst naher zuhause auf meinem xampp testen..

Hier die Lösung (die Sounds werden nach dem 'onLoad' zum Test direkt abgespielt):
Code:
stop();

var XMLdata = new XML();
XMLdata.ignoreWhite=true;
XMLdata.load("sounds.xml");
XMLdata.onLoad = function(success){
    var amount = XMLdata.firstChild.childNodes.length;
    for(var i=0; i<amount; i++){
            sound_id = XMLdata.firstChild.childNodes[i].attributes.sound_id;
            sound_file = XMLdata.firstChild.childNodes[i].attributes.sound_file;
            _root[sound_id] = new Sound();
            _root[sound_id].onLoad = function(success:Boolean){
                _root[sound_id].start();
                ExternalInterface.addCallback("play_"+sound_id, _root[sound_id], _root[sound_id].start);
            }
            _root[sound_id].loadSound(sound_file, false);
    }
}
nochmal vielen Dank für eure Hilfe
Brian Miller ist offline   Mit Zitat antworten
Alt 18-11-2010, 10:41   #9 (permalink)
Neuer User
 
Registriert seit: Nov 2010
Beiträge: 4
Um das Ganze nochmal komplett zu machen.. -> in as2 hat das mit dem externalinterface.addcallback nicht gefunzt.. nach 3 Tage googlen hab ich mich dann dafür entschieden, dass ganze auf as3 umzubauen (da hatte ich ja bereits ne statische Variante, wo die Sounds direkt mit in die swf compilet werden..)
Dann hab ich daran noch zwei Tage rumgefriggelt, und nachdem ich eben grad gemerkt habe, dass ich die externen Sound Files (mp3s) auch einfach in ein Array laden kann (was mein Problem mit den in der For Schleife dynamisch erzeugten Variablen aus dem Weg schafft) läuft es jetzt

Folglich läd mein as3 Script jetzt mp3 Files aus einer xml Liste nach, schreibt die in ein Array, dessen Items mit den IDs aus der xml benannt werden, und können dann per ExternalInterface.AddCallBack (JavaScript anfrage mit Parameter) aufgerufen und abgespielt werden. Hier mein Script damit auch andere noch was davon haben:

Code:
stop();

import flash.external.ExternalInterface;
import flash.net.URLRequest;
import flash.events.Event;

var myLoader:URLLoader = new URLLoader();
var myURL:URLRequest = new URLRequest("sounds_as3.xml");
myLoader.addEventListener(Event.COMPLETE, onLoadComplete);
myLoader.load(myURL);
var myXML:XML;

var sounds:Array = [];

function onLoadComplete(event:Event):void{
    XML.ignoreWhitespace = true;
    XML.ignoreComments = true;
    
    myXML = new XML(event.target.data);
    
    for(var i:int = 0; i < myXML.sound.length(); i++){
        var sound_id:String = myXML.sound[i].sound_id.text();
        var sound_file:String = myXML.sound[i].sound_file.text();
        
        var myURL:URLRequest = new URLRequest(sound_file);
        sounds[sound_id] = new Sound(myURL);
    }
}

function playSound(objParams:Object):void{
    var param:String = objParams.sound_id_param;
    sounds[param].play();
}
ExternalInterface.addCallback("playSound", playSound);
Lässt sich aber bestimmt noch verbessern (verkleinern).. werde jetzt im nächsten Schritt mal versuchen, jedem Sound im xml noch zwei weitere Eigenschaften zu geben, über die bestimmt wird, ob der jeweilige Sound bis zu nem Stop Befehl in einer Schleife abgespielt wird.. und eine über die bestimmt wird, ob der jeweilige Sound vorgeladen werden muss oder nicht.

EDIT:
und hier nochmal die xml und das JavaScript dazu (hatte ich ganz Vergessen):

Code:
<?xml version="1.0" encoding="utf-8"?>
<sounds>
    <sound>
        <sound_id>chimes</sound_id>
        <sound_file>sounds/chimes.mp3</sound_file>
    </sound>
    <sound>
        <sound_id>chord</sound_id>
        <sound_file>sounds/chord.mp3</sound_file>
    </sound>
    <sound>
        <sound_id>ding</sound_id>
        <sound_file>sounds/ding.mp3</sound_file>
    </sound>
</sounds>
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
    function playSound(sound_id){
        var obj = swfobject.getObjectById("soundFlash");       
        if (obj && typeof obj.playSound != "undefined") {
            var objParams = {
                sound_id_param: sound_id,
                sonstiges: "Weitere parameter"
            };
            obj.playSound(objParams);
        }else{
            alert("undefined");
        }
    }
</script>
</head>
<body>
<object id="soundFlash" data="sounds.swf" type="application/x-shockwave-flash" width="1" height="1">
    <param name="wmode" value="transparent">
</object>
<a href="javascript:playSound('chimes');">play chimes</a>
<a href="javascript:playSound('chord');">play chord</a>
<a href="javascript:playSound('ding');">play ding</a>
</body>
</html>

Geändert von Brian Miller (18-11-2010 um 10:56 Uhr)
Brian Miller ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
addcallback, externalinterface, new sound, xml

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mp3s per click abspielen Markus85 Flash Einsteiger 1 10-01-2007 18:05
dynamisch mp3s aus DB laden amadeus Flash MX 3 03-02-2004 22:03
MP3s lauter abspielen? FlashBAK Flash MX 9 01-10-2003 22:20
MP3s laden und crossfaden p-cord Flash MX 2 22-09-2002 21:34
MP3s laden gnomjogson ActionScript 1 4 24-04-2002 08:43


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele