我想在java应用程序(SE)中使用SIP连接进行流媒体和音频。我连接到服务器并收到200条OK消息。我想接收服务器发送的数据。我创建了一个套接字并获得了一个输入流。我是这样做的。 123.456.789.1是我的IP地址,1234是我的应用程序监听端口。
Socket socket=new Socket("123.456.789.1",1234);
InputStream in=socket.getInputStream();
System.out.println("inputSream available :"+in.available());
但是 in.available() 始终为 0 。
但是如果我得到Object content=response.getContent()
;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(content);
byte[] contentBytes = bos.toByteArray();
contenBytes 的长度等于响应内容的长度。但是当我尝试获取 inputStream 和 Play 时,如下所示
InputStream pp=new ByteArrayInputStream(b);
AudioStream as = new AudioStream(pp);
AudioData data = as.getData();
ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data);
抛出异常;java.io.IOException:无法从输入流创建音频流
然后我尝试读取输入流 in.read() ,然后在读取一些字节时抛出 IOException 。
Q1.如何解决并从套接字获取InputStream?
Q2。如何获取输入流来播放音频?
或者让我知道问题出在哪里以及如何解决。
更新:感谢所有显示错误的人in.availabe();
然后我改变了代码。
ByteArrayOutputStream ou=new ByteArrayOutputStream();
int i=0;
System.out.println("Before while");
while((i=in.read())!=-1){
ou.write(i);
System.out.println("Wrote :"+i);
}
不幸的是,应用程序没有进一步发展。这意味着仅打印 Before while。应用程序仅显示正在运行(我使用 netbeans IDE)。我不知道为什么。有任何说明吗?
最佳答案
当您使用 getContent 时,您会得到某种包装内容的对象。然后使用 ObjectOutputStream 编写该对象的 Java 表示形式,而不是原始数据的实际字节。
你应该能够做到
AudioStream as = new AudioStream(in);
AudioData data = as.getData();
ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data);
或者如果您确实想缓冲数据
int chunkSize;
byte[] chunk = new byte[2048];
ByteArrayOutputStream outBuffer = new ByteArrayOutputStream();
while ( ( chunkSize = in.read(chunk) ) != -1) {
outBuffer.write(chunk, 0, chunkSize);
}
ByteArrayInputStream inBuffer = new ByteArrayInputStream(outBuffer.toByteArray());
AudioStream as = new AudioStream(inBuffer);
AudioData data = as.getData();
ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data);
available() 显示在阻塞之前可以保证读取多少字节。它可能总是返回 0。
关于java - 从套接字获取输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8769300/