Zurück   Flashforum > Flex und AIR > Flex allgemein

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 28-04-2010, 10:59   #1 (permalink)
Neuer User
 
Registriert seit: Mar 2010
Beiträge: 48
MP3-Stream verwerfen?

Hallo,

ich probiere mich gerade an einem kleinen Tool, mit dem ich Internet-MP3-Streams abspielen möchte. Da ich aus Erfahrung und durch Recherche weiß, dass bei Flash/Flex durch das Abspielen von Streams der Arbeitsspeicher zuläuft, habe ich mich mal an einer Behelflösung versucht:

Ich habe 2 Channels, die nach einer bestimmten Zeit immer ineinander überblenden.

Damit es sich besser testen lässt, hier mal der komplette Code:
PHP-Code:
    <fx:Script>
        <![
CDATA[
            
import flash.media.*;
            
            
import flashx.textLayout.formats.Float;
            
            private var 
request:URLRequest;
            private var 
context01:SoundLoaderContext;
            private var 
context02:SoundLoaderContext;
            private var 
soundFactory01:Sound;
            private var 
soundFactory02:Sound;
            private var 
channel01:SoundChannel;
            private var 
channel02:SoundChannel;
            private var 
lautTransform:SoundTransform;
            private var 
leiseTransform:SoundTransform;
            private var 
activeStream:int;
            private var 
lautstaerkeDiff:Number;
            private var 
lautstaerke01:Number;
            private var 
lautstaerke02:Number;
            private var 
durchlauf:int;
            
            private function 
init():void
            
{
                
this.request = new URLRequest("http://c22033-l.i.core.cdn.streamfarm.net/22005mdrsputnik/live/3087mdr_sputnik/live_de_128.mp3");
                
this.context01 = new SoundLoaderContext(6true);
                
this.soundFactory01 = new Sound(requestcontext01);  
                
this.channel01 = new SoundChannel();
                
this.leiseTransform = new SoundTransform(0,0);
                
this.lautTransform = new SoundTransform(1,0);
                
this.lautstaerkeDiff 0.01;
                
this.lautstaerke01=1;
                
this.lautstaerke02=0;
                
this.durchlauf=0;
                
                
channel01.soundTransform lautTransform;            
                
channel01 soundFactory01.play();
                
activeStream 1;
                
tArea.text "Es spielt Channel 1 \n";
                
                
controlStreams();
            }
            
            private function 
controlStreams():void
            
{
                var 
myTimer:Timer = new Timer(300001); // Aller 2 Minuten!
                
myTimer.addEventListener("timer"timerHandler);
                
myTimer.start();
                
tArea.text += "Der Timer wurde mit 30 Sekunden Laufzeit gestartet! \n";
            }
            
            private function 
timerHandler(event:TimerEvent):void {
                
tArea.text += "Der Timer ist abgelaufen! \n";
                
tArea.text += "Der naechste Stream wird gestartet! \n";
                
                if (
activeStream == 1)
                {
                    var 
myTimer:Timer = new Timer(10100); // Aller 2 Minuten!
                    
myTimer.addEventListener("timer"fade1Out2InHandler);
                    
myTimer.start();
                    
tArea.text += "Fade wurde gestartet! \n";
                }
                else
                {
                    var 
myTimer:Timer = new Timer(10100); // Aller 2 Minuten!
                    
myTimer.addEventListener("timer"fade2Out1InHandler);
                    
myTimer.start();
                    
tArea.text += "Fade wurde gestartet! \n";
                }
            }
            
            private function 
fade1Out2InHandler (event:TimerEvent):void
            
{
                if (
lautstaerke02 ==0)
                {
                    
this.context02 = new SoundLoaderContext(6true);
                    
soundFactory02 = new Sound(requestcontext02);  
                    
channel02 = new SoundChannel();        
                    
channel02.soundTransform leiseTransform;
                    
channel02 soundFactory02.play();
                }
                
                
lautstaerke01 lautstaerke01-lautstaerkeDiff;
                
//tArea.text += "Lautstärke Channel01: "+lautstaerke01+" \n";
                
lautstaerke02 lautstaerke02+lautstaerkeDiff;
                
//tArea.text += "Lautstärke Channel02: "+lautstaerke02+" \n";
                
                
var volumeTransform01:SoundTransform = new SoundTransform(lautstaerke01,0);
                var 
volumeTransform02:SoundTransform = new SoundTransform(lautstaerke02,0);
                
                
channel01.soundTransform volumeTransform01;    
                
channel02.soundTransform volumeTransform02;
                
                
durchlauf++;
                
                if (
durchlauf == 100)
                {
                    
lautstaerke01 0;
                    
lautstaerke02 1;
                    
channel01.soundTransform leiseTransform;
                    
channel01 null;
                    
this.context01 null;
                    
soundFactory01.close();
                    
activeStream 2;
                    
tArea.text += "Es spielt Channel 2 \n";
                    
                    
controlStreams();
                    
tArea.text += "ControlStreams gestartet \n";
                }
            }
            
            private function 
fade2Out1InHandler (event:TimerEvent):void
            
{
                if (
lautstaerke01 ==0)
                {
                    
this.context01 = new SoundLoaderContext(6true);
                    
soundFactory01 = new Sound(requestcontext01);  
                    
channel01 = new SoundChannel();        
                    
channel01.soundTransform leiseTransform;
                    
channel01 soundFactory02.play();
                }
                
                
lautstaerke02 lautstaerke02-lautstaerkeDiff;
                
//tArea.text += "Lautstärke Channel02: "+lautstaerke02+" \n";
                
lautstaerke01 lautstaerke01+lautstaerkeDiff;
                
//tArea.text += "Lautstärke Channel01: "+lautstaerke01+" \n";
                
                
var volumeTransform01:SoundTransform = new SoundTransform(lautstaerke01,0);
                var 
volumeTransform02:SoundTransform = new SoundTransform(lautstaerke02,0);
                
                
channel01.soundTransform volumeTransform01;    
                
channel02.soundTransform volumeTransform02;
                
                
durchlauf++;
                
                if (
durchlauf == 100)
                {
                    
lautstaerke02 0;
                    
lautstaerke01 1;
                    
channel02.soundTransform leiseTransform;
                    
channel02 null;
                    
this.context02 null;
                    
soundFactory02.close();
                    
activeStream 1;
                    
tArea.text += "Es spielt Channel 1 \n";
                    
                    
controlStreams();
                    
tArea.text += "ControlStreams gestartet \n";
                }
            }
        ]]>
    </
fx:Script
Das Problem das ich nun habe ist Folgendes:
Die erste Überblende verläuft ohne Probleme, man hört zwar einen kleinen Übergang, der aber nicht weiter störend ist. Sobald ich aber wieder auf den Channel01 blende, spielt er den gleich Inhalt ab den er zuvor geladen hat. Ich habe schon versucht alles mögliche auf null zu setzen, aber irgendwie verwirft er die bisher geladene Information nicht - hat Jemand einen Tipp, wie ich es anstelle, dass er den Stream tatsächlich neu lädt?

Danke euch!
QueenF ist offline   Mit Zitat antworten
Alt 28-04-2010, 13:31   #2 (permalink)
Neuer User
 
Registriert seit: Mar 2010
Beiträge: 48
Lösung und neues Problem ...

Hallo, ich habe nun die Lösung gefunden, wie meine Channels immer von der aktuellen Position weiter spielen und nicht das zuvor geladene behalten - ich speichere den Request, den LoaderContext und den Sound nicht extra in Variablen, sondern erzeuge alles dynamisch:

PHP-Code:
channel01 = new SoundChannel();
channel01 = new Sound(
    new 
URLRequest("http://c22033-l.i.core.cdn.streamfarm.net/22005mdrsputnik/live/3087mdr_sputnik/live_de_128.mp3"), 
    new 
SoundLoaderContext(6true)).play(); 
So funktioniert es auch super - der Stream wird zunächst auf dem Channel01 abgespielt - dann auf dem Channel02, dann wieder auf dem Channel01, dann wieder auf dem Channel02 ABER wenn er dann wieder versucht den Stream auf Channel01 abzuspielen stehen zwar die Ausgaben wie programmiert da, jedoch hört man keinen Ton - das gleiche zieht sich auch durch, wenn dann wieder Channel02 gestartet wird ... alle Ausgaben kommen, aber kein Ton.
Wird dann wieder der Channel01 getartet, so kommt: Error #2044: Unhandled IOErrorEvent:. text=Error #2032: Stream Error.

Wie kann es denn sein, dass das Laden des Streams genau 2 mal klappt - und immer exakt beim dritten Mal der Fehler kommt? Was kann ich dagegen machen?

Danke schon mal und liebe Grüße!

PS: Falls Jemand es mal bei sich testen möchte, hier mal der aktuelle, komplette Code:

PHP-Code:
<fx:Script>
        <![
CDATA[
            
import flash.media.*;
            
            
import flashx.textLayout.formats.Float;
            
            private var 
channel01:SoundChannel;
            private var 
channel02:SoundChannel;
            private var 
activeStream:int;
            private var 
lautstaerkeDiff:Number;
            private var 
lautstaerke01:Number;
            private var 
lautstaerke02:Number;
            private var 
durchlauf:int;
            
            private function 
init():void
            
{
                
this.channel01 = new SoundChannel();
                
this.lautstaerkeDiff 0.01;
                
this.lautstaerke01=1;
                
this.lautstaerke02=0;
                
this.durchlauf=0;
                
                
channel01.soundTransform = new SoundTransform(1,0);        
                
channel01 = new Sound(
                    new 
URLRequest("http://c22033-l.i.core.cdn.streamfarm.net/22005mdrsputnik/live/3087mdr_sputnik/live_de_128.mp3"), 
                    new 
SoundLoaderContext(6true)).play();
                
activeStream 1;
                
tArea.text "Es spielt Channel 1 \n";
                
controlStreams();
            }
            
            private function 
controlStreams():void
            
{
                var 
myTimer:Timer = new Timer(30*10001); // 30 Sekunden
                
myTimer.addEventListener("timer"timerHandler);
                
myTimer.start();
                
tArea.text += "Der Timer wurde mit 30 Sekunden Laufzeit gestartet! \n";
            }
            
            private function 
timerHandler(event:TimerEvent):void {                
                var 
myNewTimer:Timer = new Timer(10100);
                
myNewTimer.addEventListener("timer"fadeHandler);
                
myNewTimer.start();
                
tArea.text += "Fade wurde gestartet! \n";
            }
            
            private function 
fadeHandler (event:TimerEvent):void
            
{
                if (
this.activeStream == 1)
                {
                    
fade1Out2InHandler();
                } else
                {
                    
fade2Out1InHandler();
                }
            }
            
            private function 
fade1Out2InHandler ():void
            
{
                if (
lautstaerke02 ==0)
                {
                    
channel02 = new SoundChannel();        
                    
tArea.text += "Neuer Channel 2 angelegt! \n";
                    
channel02.soundTransform = new SoundTransform(0,0);
                    
channel02 = new Sound(
                        new 
URLRequest("http://c22033-l.i.core.cdn.streamfarm.net/22005mdrsputnik/live/3087mdr_sputnik/live_de_128.mp3"), 
                        new 
SoundLoaderContext(6true)).play();
                }
                
                
lautstaerke01 lautstaerke01-lautstaerkeDiff;
                
lautstaerke02 lautstaerke02+lautstaerkeDiff;
                
                
channel01.soundTransform = new SoundTransform(lautstaerke01,0);
                
channel02.soundTransform = new SoundTransform(lautstaerke02,0);
                
                
durchlauf++;
                
                if (
durchlauf == 100)
                {
                    
lautstaerke01 0;
                    
lautstaerke02 1;
                    
channel01.stop();
                    
channel01.soundTransform = new SoundTransform(0,0);
                    
channel02.soundTransform = new SoundTransform(1,0);
                    
channel01 null;

                    
activeStream 2;
                    
tArea.text += "Es spielt Channel 2 \n";
                    
                    
controlStreams();
                    
this.durchlauf 0;
                }
            }
            
            private function 
fade2Out1InHandler ():void
            
{
                if (
lautstaerke01 ==0)
                {
                    
channel01 = new SoundChannel();
                    
tArea.text += "Neuer Channel 1 angelegt! \n";
                    
channel01.soundTransform = new SoundTransform(0,0);
                    
channel01 = new Sound(
                        new 
URLRequest("http://c22033-l.i.core.cdn.streamfarm.net/22005mdrsputnik/live/3087mdr_sputnik/live_de_128.mp3"), 
                        new 
SoundLoaderContext(6true)).play();
                }

                
lautstaerke02 lautstaerke02-lautstaerkeDiff;
                
lautstaerke01 lautstaerke01+lautstaerkeDiff;
                
                
channel01.soundTransform = new SoundTransform(lautstaerke01,0);
                
channel02.soundTransform = new SoundTransform(lautstaerke02,0);
                
                
durchlauf++;
                
                if (
durchlauf == 100)
                {
                    
lautstaerke02 0;
                    
lautstaerke01 1;
                    
channel02.stop();
                    
channel02.soundTransform = new SoundTransform(0,0);
                    
channel01.soundTransform = new SoundTransform(1,0);
                    
channel02 null;

                    
activeStream 1;
                    
tArea.text += "Es spielt Channel 1 \n";
                    
                    
controlStreams();
                    
this.durchlauf 0;
                }
            }
        ]]>
    </
fx:Script>
    <
s:TextArea id="tArea" x="98" y="98" width="442" height="297"/> 

Geändert von QueenF (28-04-2010 um 14:03 Uhr)
QueenF ist offline   Mit Zitat antworten
Alt 30-04-2010, 10:16   #3 (permalink)
Neuer User
 
Registriert seit: Mar 2010
Beiträge: 48
Immer noch keine Idee ... :-(

Hallo,

ich stehe immer noch an dem gleichen Problem. Ich habe nun das Umschalten der Channel durch einen Button realisiert und die Channel nur einmal in der init-Methode durch "new" erzeugt und im weiteren Verlauf nur neue Sounds zum Laden gegeben ... nichts hilft - es wird Channel01 und Channel02 jeweils exakt 2 mal abgespielt, danach verschwindet der Ton und dann kommt der Error ... ich weiß nicht weiter!

Ich habe das Programm mit hochgeladen. Vielleicht kann es ja mal Jemand bei sich testen und mir dann schreiben woran es liegen könnte. Ich danke euch schon jetzt!

Liebe Grüße!
Angehängte Dateien
Dateityp: zip Main.zip (1,2 KB, 2x aufgerufen)
QueenF ist offline   Mit Zitat antworten
Alt 04-05-2010, 11:54   #4 (permalink)
Neuer User
 
Registriert seit: Mar 2010
Beiträge: 48
Hallo - ich bin mit meinem Problem immer noch nicht weiter ... da ich in meinem Code immer wieder über new Sound() den Channel neu lade, kann es sein, dass es da intern irgend eine Begrenzung gibt, dass man nur 6 mal new Sound() ausführen kann?
Wenn ja - hat einer eine Idee wie ich das umgehen könnte?

Ich hoffe es findet sich noch Jemand der mir helfen kann :-(

LG!
QueenF ist offline   Mit Zitat antworten
Alt 19-05-2010, 08:36   #5 (permalink)
Neuer User
 
Registriert seit: Mar 2010
Beiträge: 48
Hallo - schon wieder ich und immer noch kein Stück weiter ... :-(
Meine Vermutung, dass es eine interne Begrenzung der Sound-Objekte gibt habe ich nun selbst wiederlegt - ich habe in EXAKT dem selben Code im URL-Request eine auf der Festplatte liegende MP3-Datei (und mal nicht dem Stream) aufgerufen - und es lief eiwandfrei ... :-(
Nun bin ich absolut am Ende meines Lateins - wie kann der gleiche Code bei einer Datei gehen und bei einem Stream nicht?!? Hat hier niemand eine Vermutung/Idee woran das liegen könnte und wie ich das Problem lösen kann?

Ich wäre dankbar für jeden Hinweis!

DANKE und LG!
QueenF ist offline   Mit Zitat antworten
Alt 19-05-2010, 12:10   #6 (permalink)
Neuer User
 
Registriert seit: Oct 2008
Beiträge: 114
Es gibt eine neue API, die hilfreich sein könnte...
ByteArray Access to NetStream in Flash Player 10.1 <font size='1'>[ by Thibault Imbert ]</font> - ByteArray.org
flash.net.NetStream - BETA ActionScript 3.0 Reference for the Adobe Flash Platform

Im Prinzip musst Du die MP3-Daten als bytearray bekommen, einen FLV header davorschieben und dann diesen array via appendBytes in einen netstream umleiten.
fippo ist offline   Mit Zitat antworten
Antwort

Lesezeichen

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
Warum schöne neue Konzepte verwerfen? dr.solo Flash CS3 Professional 1 19-09-2007 11:46
FLASH STREAM wirklich STREAM ??? gio*lemon Flash MX 2004 7 04-07-2006 14:58
Stream Moscha Flash MX 1 06-09-2005 09:46
Sound Objekt - Stream oder nicht Stream... toti Flash MX 2 08-12-2003 23:02
stream / nicht stream=richtig? RedSaint Flash MX 3 28-02-2003 16:56


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:53 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele