java - 从套接字获取输入流

标签 java connection audio-streaming sip

我想在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/

相关文章:

java - 为什么使用工厂方法时 TypeToken 无法捕获泛型类型?

java - 如何使用 header "Range"分段发送文件?

php - 如何修复错误: "Connection failed: Access denied for user ' username' @'servername' (using password: NO)"

java - 在 java.nio 中指定连接超时

stream - 如何使用 ffmpeg 创建流式音频文件?

java - 无法使 gradle 导入 Lombok 依赖项

java - 打印JTextPane时简单的页面大小设置?

java - 在 ViewHolder 内部类中访问 RecyclerView.Adapter 数据

c++ - 用于音频文件流的 FFMPEG 命令

javascript - 将音频从浏览器流式传输到具有特定 MIME 类型的 Node.js 服务器