我有一个基于Java的服务器端和一个使用Spring BlazeDS Integration的Flex客户端。它工作正常,但我想最近从服务器端获得声音。
我遵循了这个BlazeDS mapping doc,它说当Java返回Byte []时,它将被转换为我想要的ByteArray。所以我通过ByteArrayOutputStream处理MP3文件,将其转换为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=""/>
它说“真实”。有谁知道这是什么问题。
答案 0 :(得分:1)
您可以通过Web服务返回声音字节。获得字节后,可以将其添加到Sound对象并播放。唯一的问题是,由于它是一个Web服务,客户端必须先加载所有字节才能播放。如果你想传输声音,你需要一个像FMS或Wowza这样的流媒体服务器(我推荐后者)。
答案 1 :(得分: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)
}