Почему в Wireshark используется UDP, а не RTP, когда я использую jmf?
Я хочу захватывать и передавать аудио с использованием JMF 2.1.1e в формате RTP. Я написал простой передатчик, я могу передавать и получать аудио. Но когда я увидел в Wireshark, я увидел пакеты как UDP. Может кто-нибудь указать мне на проблему, пожалуйста.
И вот моя функция отвечает за захват и передачу звука.
public void captureAudio(){
// Get the device list for ULAW
Vector devices = captureDevices();
CaptureDeviceInfo captureDeviceInfo = null;
if (devices.size() > 0) {
//get the first device from the list and cast it as CaptureDeviceInfo
captureDeviceInfo = (CaptureDeviceInfo) devices.firstElement();
}
else {
// exit if we could not find the relevant capturedevice.
System.out.println("No such device found");
System.exit(-1);
}
Processor processor = null;
try {
//Create a Processor for the specified media.
processor = Manager.createProcessor(captureDeviceInfo.getLocator());
} catch (IOException ex) {
System.err.println(ex);
} catch (NoProcessorException ex) {
System.err.println(ex);
}
//Prepares the Processor to be programmed.
//puts the Processor into the Configuring state.
processor.configure();
//Wait till the Processor configured.
while (processor.getState() != Processor.Configured){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//Sets the output content-type for this Processor
processor.setContentDescriptor(CONTENT_DESCRIPTOR);
/**
ContentDescriptor CONTENT_DESCRIPTOR
= new ContentDescriptor(ContentDescriptor.RAW_RTP);
*/
//Gets a TrackControl for each track in the media stream.
TrackControl track[] = processor.getTrackControls();
boolean encodingOk = false;
//searching through tracks to get a supported audio format track.
for (int i = 0; i < track.length; i++) {
if (!encodingOk && track[i] instanceof FormatControl) {
if (((FormatControl)
track[i]).setFormat( new AudioFormat(AudioFormat.ULAW_RTP, 8000, 8, 1) ) == null)
{
track[i].setEnabled(false);
}
else {
encodingOk = true;
track[i].setEnabled(encodingOk);
System.out.println("enc: " + i);
}
} else {
// we could not set this track to ULAW, so disable it
track[i].setEnabled(false);
}
}
//If we could set this track to ULAW we proceed
if (encodingOk){
processor.realize();
while (processor.getState() != Processor.Realized){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
DataSource dataSource = null;
try {
dataSource = processor.getDataOutput();
} catch (NotRealizedError e) {
e.printStackTrace();
}
try {
String url= "rtp://192.168.1.99:49150/audio/1";
MediaLocator m = new MediaLocator(url);
DataSink d = Manager.createDataSink(dataSource, m);
d.open();
d.start();
System.out.println("transmitting...");
processor.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
И, пожалуйста, спросите, не находите ли вы что-то неправильное или расплывчатое Заранее спасибо.:)
Уточнение: у меня есть кусочек кода C# для потоковой передачи RTP. И когда я собираю данные с помощью wireshark, я вижу их как RTP, но проблема заключается в том, что когда я получаю поток данных из JMF, Wireshark показывает их как UDP. И мой вопрос, почему?
Я знаю разницу между UDP и RTP.
2 ответа
Если я правильно понимаю ваш вопрос, вы хотите знать, почему RTP-пакеты не распознаются как RTP-пакеты в wireshark. По моему опыту, это может быть случай, если Wireshark не имеет достаточно информации о сеансе RTP.
Например: 1) если я прослушиваю сеанс RTP, который был настроен с использованием RTSP или SIP и SDP, то wireshark покажет обнаружение RTP. 2) Однако в другом приложении, в котором я настраивал сеанс с использованием локальных описаний SDP, пакеты отображаются как UDP. Во втором сценарии wireshark видит пакеты RTP, но не имеет информации, чтобы классифицировать их как RTP. Поскольку RTP обычно располагается поверх UDP, а wireshark может классифицировать пакеты UDP, они классифицируются как таковые.
К вашему сведению, вы можете выбрать пакет из потока, который вам известен как RTP, и выбрать "Декодировать как". Затем выберите RTP из списка протоколов для соответствующего потока (и RTCP для другого, если применимо), и затем wireshark покажет пакеты как RTP, и вы сможете увидеть информацию о пакете.
Я не уверен, является ли это причиной в вашем конкретном случае, но, возможно, есть разница между вашим JMF и вашим примером на C#? Похоже, вы используете SIP для приложения C#, а для JMF - ничего?
RTP - это прикладной уровень, UDP - это транспортный уровень, который отличается от уровня! Википедия помогает объяснить это в деталях. Таким образом, ваши данные отправляются в виде потока RTP в UDP-фрейме
Небольшой обзор...
Слои приложения:
* DHCP
* DHCPv6
* DNS
* FTP
* HTTP
* IMAP
* IRC
* LDAP
* MGCP
* NNTP
* BGP
* NTP
* POP
* RPC
* RTP
* RTSP
* RIP
* SIP
* SMTP
* SNMP
* SOCKS
* SSH
* Telnet
* TLS/SSL
* XMPP
* (more)
Транспортный слой
* TCP
* UDP
* DCCP
* SCTP
* RSVP
* (more)
Интернет слой
* IP
o IPv4
o IPv6
* ICMP
* ICMPv6
* ECN
* IGMP
* IPsec
* (more)
Слой связи
* ARP/InARP
* NDP
* OSPF
* Tunnels
o L2TP
* PPP
* Media access control
o Ethernet
o DSL
o ISDN
o FDDI
* (more)