如何从基于java的服务中获得声音



我有一个基于Java的服务器端和一个使用SpringBlazeDS集成的flex客户端。它工作得很好,但我想最近从服务器端获得声音。

我遵循了这个BlazeDS映射文档,它说当Java返回Byte[]时,它将被转换为我想要的ByteArray。因此,我通过ByteArrayOutputStream处理MP3文件,将其转换为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=""/>

上面写着"真的"。有人知道问题出在哪里吗。

代码的问题是BlazeDS上的所有flex调用都是异步的。因此,ro.SomeMethod()不会立即返回,而是将其排队,然后根据需要进行回调。

这里有一个有效的例子请注意,我从未通过BlazeDS连接发送过byte[],但我不明白为什么它不起作用——正如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) 
}

您可以通过web服务返回声音字节。获得字节后,可以将其添加到声音对象中并播放。唯一的问题是,由于它是一个web服务,客户端必须加载所有字节才能播放。如果你想流媒体播放声音,你需要像FMS或Wowza这样的流媒体服务器(我推荐后者)。

相关内容

  • 没有找到相关文章

最新更新