我想在java应用程序(SE)中使用SIP连接进行流式传输和音频。我与服务器连接并获得200条OK消息。我想接收服务器发送的数据。我创建了一个SOCKET并获得了一个InputStream。我就是这样做的。 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。如何让inputStream播放音频?
或者让我知道问题出在哪里以及如何解决问题。
更新:感谢所有出现问题的人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);
}
不幸的是,应用程序没有进一步发展。这意味着只有在打印之前。应用程序只显示运行(我使用netbeans IDE)。我不知道为什么。任何澄清?
答案 0 :(得分:1)
当你使用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.
答案 1 :(得分:0)
available()是可以读取执行阻止调用OS的字节数。如果您想知道有多少数据可用,您应该尝试阅读它并查看您获得了多少数据。