Как получить звук из сервисов на основе Java - PullRequest
1 голос
/ 23 февраля 2012

У меня есть серверная часть на основе Java и гибкая клиентская часть, использующая интеграцию Spring BlazeDS.Это работает нормально, но я хочу получить звук со стороны сервера в последнее время.

Я следовал этому документу BlazeDS mapping , он говорит, что когда Java вернет Byte [], он будет преобразован в ByteArray, который я хочу.Поэтому я обрабатываю файл MP3 с помощью ByteArrayOutputStream, преобразую его в Byte [] и возвращаю его обратно во внешний интерфейс, но значение, которое получает Actionscript, становится нулевым.

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=""/>

И это говорит "правда".Кто-нибудь знает, в чем проблема.

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Проблема с вашим кодом заключается в том, что все вызовы flex через 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) 
}
1 голос
/ 23 февраля 2012

Вы можете вернуть байты звука через веб-сервис. После того, как вы получили байты, вы можете добавить его к объекту Sound и воспроизвести его. Единственная проблема заключается в том, что, поскольку это веб-служба, клиенту необходимо загрузить все байты, прежде чем он сможет воспроизвести. Если вы хотите передавать звук, вам понадобится потоковый сервер, такой как FMS или Wowza (я рекомендую последний).

...