我正在服务器和客户端之间建立基于套接字的连接,客户端发送一个byte [],由AudioInputStream获取,在JSON中,服务器接收JSON进程,另一个JSON带有其他信息,但是byte []保持不变,但是当我尝试将其流回.wav时,我得到了这个:
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1121)
at sweepvoiceclient.SendMessage.jButton2ActionPerformed(SendMessage.java:162)
at sweepvoiceclient.SendMessage.access$000(SendMessage.java:26)
at sweepvoiceclient.SendMessage$1.actionPerformed(SendMessage.java:74)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
我的客户的代码是:
try {
File file = new File("audio.wav");
AudioInputStream inputStream =
AudioSystem.getAudioInputStream(file);
byte [] fileContent = new byte [(int)file.length()];
inputStream.read(fileContent);
JsonObject objectToSend = new Message(
Integer.parseInt(senderField.getText()),
Integer.parseInt(receiverField.getText()),
fileContent
).createJson();
System.out.println(objectToSend.toString());
SweepVoiceClientSocket socket = new SweepVoiceClientSocket();
socket.write(objectToSend);
JsonObject object = socket.read();
AudioInputStream source = AudioSystem
.getAudioInputStream(
new BufferedInputStream(
new ByteArrayInputStream(
Base64.decode(object.getString("message"))
)
)
);
AudioInputStream pcm = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, source);
AudioSystem.write(
pcm,
AudioFileFormat.Type.WAVE,
new File("nvo.wav"));
} catch(Exception ex){ex.printStackTrace();}
服务器唯一能做的就是Base64.decode和Base64.encode。
这是正确的方法吗? 还有另一种方式更有效吗? 其中???
谢谢你
答案 0 :(得分:0)
有问题:
inputStream.read(fileContent);
// or your previous version
while (inputStream.read(fileContent) != -1){}
你应该检查已经重新加载了多少字节,并在下一次执行开始时将readed字节保存到数组中的正确偏移量。
byte [] fileContent = new byte [size];
int readed=0;
while (readed<size) {
int r = inputStream.read(fileContent, readed, size-readed);
if (r<0) break;
readed = readed + r;
}