我需要生成G711多播音频流,并且作为Java Media Framework的一部分遇到了AVTransmit2示例。
这很有用,但是多播数据包都将TTL设置为1。
我发现一些文档表明SessionAddress可以指定一个TTL值,所以我尝试改变它,即 destAddr = new SessionAddress(ipAddr,port,255);
我还发现一些评论说这些问题可能是因为java默认为IPv6,所以我试图通过启动它来强制它到ipv4: java -Djava.net.preferIPv4Stack = true -classpath“。” AVTransmit2 javasound:// 8000 239.1.10.65 20480
然而,看看wireshark,数据包仍然有TTL = 1
我正在使用JMF2.1.1e
有任何建议如何解决这个问题?
答案 0 :(得分:1)
这已经晚了六个月了,但我在寻找解决同样问题时发现了这个问题,这就是我发现的:
我还尝试在创建SessionAddress对象时设置ttl值,但是使用wireshark,数据包仍然只有1的ttl。但是,我使用不同的地址进行初始化和目标,但是ttl设置在我使用时工作了同一地址。因此,如果您有两个SessionAddress对象,例如
String addr = "239.192.1.1";
int port = 22224;
int ttl = 32;
SessionAddress multiAddress =
new SessionAddress(InetAddress.getByName(addr), port, ttl);
SessionAddress localAddress =
new SessionAddress(InetAddress.getLocalHost(), SessionAddress.ANY_PORT, ttl);
SessionAddress multiAny =
new SessionAddress(InetAddress.getByName(addr), port, ttl);
然后你必须按如下方式使用地址:
GOOD
RTPManager rtpManager = RTPManager.newInstance();
rtpManager.initialize(multiAddress);
rtpManager.addTarget(multiAddress);
GOOD
RTPManager rtpManager = RTPManager.newInstance();
rtpManager.initialize(multiAny);
rtpManager.addTarget(multiAddress);
BAD
RTPManager rtpManager = RTPManager.newInstance();
rtpManager.initialize(localAddress);
rtpManager.addTarget(multiAddress);
编辑:似乎只有传递给initialize()的SessionAddress需要设置ttl