常规DatagramSocket可以正常工作... ICE4J DatagramSocket似乎会截断数据!
发送大小的数据包为2500,但接收端始终为1500(使用常规Java DatagramSocket,接收数据包的大小与发送大小相同)。
接收结束:
Component rtpComponent = stream.getComponent(org.ice4j.ice.Component.RTCP);
CandidatePair rtpPair = rtpComponent.getSelectedPair();
videoDS = rtpPair.getDatagramSocket();
在线程中:
byte[] buffer = new byte[250000000];
final DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
videoDS.receive(dp);
final byte[] clone = new byte[dp.getLength()];
System.arraycopy(dp.getData(), dp.getOffset(), clone, 0, dp.getLength());
final Image image = new Image(new ByteArrayInputStream(clone));
除了在Android上运行外,发送方几乎相同。
非工作代码之间的唯一区别是第一段用于发送和接收。如果我使用常规的Java套接字,它将可以工作(但当然不能在路由器后面,这就是我使用Ice4J的原因)。
最佳答案
我发现了主要问题。
参见org.ice4j.stack.Connector第160行
/*
* Make sure localSock's receiveBufferSize is taken into
* account including after it gets changed.
*/
int receiveBufferSize = 1500;
数据显然已被切断。...请参阅第188行
packet.setData(
new byte[receiveBufferSize],
0,
receiveBufferSize);
....
localSock.receive(packet); //line 200
我当前的解决方案是将receiveBufferSize编辑为25000,而实际的数据包数据是正确的数量。也许我会要求合并。