2012-02-23 10 views
1

Spring BlazeDS Integrationを使用して、Javaベースのサーバー側とFlexクライアント側があります。それは正常に動作しますが、私は最近サーバー側から音を得たいです。Javaベースのサービスからサウンドを取得する方法

これは、BlazeDS mapping docに続き、JavaがByte []を返すと、私が望むByteArrayに変換されます。だから、MP3ファイルをByteArrayOutputStreamで処理し、Byte []に​​変換してフロントエンドに返しますが、Actionscriptの値はnull値になります。

public Byte[] sayHello() { 
    Byte[] ba = null; 

    try { 
     FileInputStream fis = new FileInputStream(
       "D:/e/Ryan Adams - I Wish You Were Here.mp3"); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte[] buffer = new byte[8192]; 
     int bytesRead; 
     while ((bytesRead = fis.read(buffer)) > 0) { 
      baos.write(buffer, 0, bytesRead); 
     } 

     byte[] byteArray = baos.toByteArray(); 
     ba = new Byte[byteArray.length]; 

     for (int i = 0; i < byteArray.length; i++) { 
      ba[i] = Byte.valueOf(byteArray[i]); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return ba; 
} 

ActionScriptコード:

<s:RemoteObject id="ro" destination="helloWorldService" fault="handleFault(event)"> 
    <s:channelSet> 
     <s:ChannelSet> 
      <s:AMFChannel uri="/flexspring/messagebroker/amf"/> 
     </s:ChannelSet> 
    </s:channelSet> 
</s:RemoteObject> 

... 

private function loaded():void { 
    var bArr:ByteArray = ro.sayHello() as ByteArray; 
    l.text = "" + (bArr == null); 
} 

... 

<s:Label id="l" text=""/> 

そして、それは "真" と言います。誰が何が問題なのか考えている人はいますか?

答えて

1

あなたのコードの問題は、BlazeDS上のすべてのフレックスコールが非同期であることです。したがって、ro.SomeMethod()はすぐには戻ってこないので、それをキューに入れて、必要に応じてコールバックを行います。

ここでは、動作するものの例を示します。byte[]をBlazeDS接続に送信したことはありませんが、なぜ動作しないのかはわかりません.J_A_Xの示唆するように、一度にすべてを送信するのではなく、とにかく

- ここでの例です:

public function loaded():void 
{ 
    var token:AsyncToken = ro.sayHello(); 
    token.addResponder(new mx.rpc.Responder(result, fault)); 
    // ...Code continues to execute... 
} 

public function result(event:ResultEvent):void 
{ 
    // The byte[] is in event.result 
    var bArr:ByteArray = event.result as ByteArray; 
} 

public function fault(event:FaultEvent):void 
{ 
    // Something went wrong (maybe the server on the other side went AWOL) 
} 
+0

本当に役に立ちました。今は音がうまくいきます。私は最後の質問、2つ以上の音を一つずつ再生する方法について質問します。 – neorc

+0

新しい質問を投稿する必要があります。私は決してFlashでサウンドを再生しようとはしませんでした。最も役立つ答えを受け入れてください(その隣の空のチェックマークをクリックしてください)。 – debracey

1

サウンドバイトはWebサービスから返すことができます。バイトを取得したら、それをSoundオブジェクトに追加して再生することができます。唯一の問題は、Webサービスであるため、クライアントが再生できる前にすべてのバイトをロードする必要があることです。サウンドをストリーミングしたい場合は、FMSやWowzaのようなストリーミングサーバが必要です(私は後者をお勧めします)。

+0

あなたがこの上の例を作ることはできますか? Javaがサウンドファイルをバイトに変換する仕組みjava.ioパッケージを使うべきですか?どこのバイトを配列に格納するのか?それで、ActionScriptがそれを元に戻す方法。画像や動画の場合も同様です。 – neorc

+0

Stackoverflowはあなたのために仕事をするためにここにはありません。あなたの質問に答えて、あなたに道のりを教えてもらった。あなたは研究をしてそれを行う必要がある人です。より多くの質問がある場合は、試したコードを投稿してください。 –

+0

彼は経験している問題に本当に対処していない曖昧な答えを与えるのではなく、その質問に答えるべきです。 – debracey

関連する問題