Java Media Framework всегда генерирует многоадресные пакеты с TTL = 1
Вопрос
Мне нужно сгенерировать многоадресный аудиопоток G711, и я наткнулся на образец AVTransmit2 как часть Java Media Framework.
По сути, это работает, однако для всех многоадресных пакетов TTL установлен на 1.
Я нашел документацию, в которой говорилось, что SessionAddress может указывать значение TTL, поэтому я попытался изменить его, т.е.destAddr = новый SessionAddr(ipAddr, порт, 255);
Я также нашел несколько комментариев о том, что проблемы могут быть связаны с тем, что Java по умолчанию использует IPv6, поэтому я попытался принудительно перевести его на ipv4, запустив его следующим образом:java -djava.net.preferipv4stack = true -classpath "." Avtransmit2 javasound: // 8000 239.1.10.65 20480
Однако, глядя в Wireshark, пакеты все еще имеют TTL = 1.
Я использую JMF2.1.1e
Есть предложения, как это решить?
Решение
Это произошло примерно на шесть месяцев позже, но я нашел эту тему, пытаясь решить ту же проблему, вот что я нашел:
Я также пытался установить значение ttl при создании объектов SessionAddress, но с помощью Wireshark пакеты по-прежнему имели значение ttl, равное 1.Однако я использовал разные адреса для инициализации и цели, но настройка 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);
Тогда вам придется использовать адреса следующим образом:
ХОРОШИЙ
RTPManager rtpManager = RTPManager.newInstance();
rtpManager.initialize(multiAddress);
rtpManager.addTarget(multiAddress);
ХОРОШИЙ
RTPManager rtpManager = RTPManager.newInstance();
rtpManager.initialize(multiAny);
rtpManager.addTarget(multiAddress);
ПЛОХОЙ
RTPManager rtpManager = RTPManager.newInstance();
rtpManager.initialize(localAddress);
rtpManager.addTarget(multiAddress);
РЕДАКТИРОВАТЬ:кажется, что только SessionAddress, переданный в Initialize(), должен иметь установленный ttl