【问题标题】:How to get sound from java-based services如何从基于 Java 的服务中获取声音
【发布时间】:2012-02-23 07:08:27
【问题描述】:

我有一个基于 Java 的服务器端和一个使用 Spring BlazeDS 集成的 flex 客户端。它工作正常,但我最近想从服务器端获取声音。

我关注了BlazeDS mapping doc,它说当 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=""/>

它说“真的”。有谁知道问题出在哪里。

【问题讨论】:

    标签: java web-services apache-flex blazeds


    【解决方案1】:

    您的代码的问题在于 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) 
    }
    

    【讨论】:

    • 这真的很有帮助,现在声音很好。我有最后一个问题,如何一个一个地播放两个或多个声音。
    • 您应该为此发布一个新问题。我从未尝试过在 Flash 中播放声音。请接受您认为最有帮助的答案(点击旁边的空白复选标记。)
    【解决方案2】:

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

    【讨论】:

    • 你能举个例子吗? Java 如何将声音文件转换为字节。我应该使用 java.io 包吗?在哪里存储字节,在数组中还是什么?然后 ActionScript 如何将其转换回来。当它是图像或视频时,它是相似的,对吧?
    • Stackoverflow 不是在这里为您完成工作的。我回答了你的问题,给了你下山的路。你是需要做研究并去做的人。如果您有更多问题,请发布您尝试过的代码,我们可以提供帮助。
    • 你应该回答这个问题,而不是给出一些不能真正解决他遇到的问题的模糊答案。
    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多