目前我正在Java TCP Socket上编写视频流接收器。我设法显示流很好,但我担心我的套接字读取的性能,因为我需要减少延迟。
每个视频有效负载的前8个字节,表示视频有效负载本身的长度。因此,我必须首先获取视频有效负载的长度,然后在将其传递给解码器之前读取视频有效负载,直到达到指定的长度。代码是这样的:
boolean isRunning = true;
boolean isReadingHeader = true;
byte[] headerBuff = new byte[8];
byte[] videoBuff;
Socket socket;
/* socket setup goes here */
DataInputStream dis = new DataInputStream(socket.getInputStream());
while(isRunning)
{
if(isReadingHeader) /* reading the header to get the length */
{
long start = System.currentTimeMillis();
dis.readFully(headerBuff);
long end = System.currentTimeMillis() - start;
System.out.println("Read Header : " + end + " ms");
int len = ....
videoBuff = new byte[len];
isReadingHeader = false;
}
else /* reading the video payload*/
{
long start = System.currentTimeMillis();
dis.readFully(videoBuff);
long end = System.currentTimeMillis() - start;
System.out.println("Read Payload: " + end + " ms");
/* Passing to Decoder goes here */
isReadingHeader = true;
}
}
由于输出是无穷无尽的,我把前20个输出如下(之后的输出是一致的):
Read Header : 6 ms
Read Payload : 0 ms
Read Header : 0 ms
Read Payload : 0 ms
Read Header : 0 ms
Read Payload : 0 ms
Read Header : 200 ms
Read Payload : 1 ms
Read Header : 142 ms
Read Payload : 0 ms
Read Header : 138 ms
Read Payload : 0 ms
Read Header : 135 ms
Read Payload : 0 ms
Read Header : 146 ms
Read Payload : 0 ms
Read Header : 136 ms
Read Payload : 0 ms
Read Header : 147 ms
Read Payload : 0 ms
正如你所看到的,读取8个字节进入headerBuff需要100ms到200ms,同时读取视频有效载荷,其长度可以是30k ++,在0ms内完成。我想知道为什么花费太长时间来读取8个字节的数据。我在for循环和read()方法中尝试过readByte()但执行时间是一样的。仅供参考,我在本地主机上测试了这个,这个延迟问题在我的.NET流接收器上没有发生(意味着网络不是原因)。
谢谢!
答案 0 :(得分:3)
而不是
DataInputStream dis = new DataInputStream(socket.getInputStream());
尝试使用BufferedInputStream
DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
希望有所帮助