1

通常の DatagramSocket は正常に動作します... ICE4J DatagramSocket はデータを切り捨てるようです!?

送信サイズのパケットは 2,500 ですが、受信側は常に 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 Socket を使用すると動作します (ただし、もちろんルーターの背後にはありません。そのため、Ice4J を使用しています)。

4

2 に答える 2

1

私は主要な問題を見つけました....

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 に編集することであり、実際のパケット データは正しい量です。多分私は合併を要求します。

于 2015-04-13T23:03:57.673 に答える