Почему это UDP, а не RTP в Wireshark, когда я использую поток jmf?

Я хочу захватывать и передавать аудио с помощью JMF 2.1.1 e в формате 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 покажет detect RTP. 2) однако в другом приложении, в котором я настраивал сеанс, используя локальные описания SDP, пакеты показать как UDP. Во втором сценарии wireshark видит пакеты RTP, но не хватает информации, чтобы классифицировать их как RTP. Поскольку RTP обычно сидит поверх UDP, а wireshark может классифицировать UDP-пакеты, они классифицируются как таковые.

FYI, вы можете выбрать пакет из потока, который вы знаете is RTP и выберите "декодировать как". Затем выберите RTP из списка протоколов для соответствующего потока (и RTCP для другого, если применимо), а затем wireshark покажет пакеты как RTP, и вы сможете увидеть информацию о пакете.

Я не уверен, что это причина в вашем конкретном случае, но, возможно, есть сигнальная разница между вашим jmf и вашим примером c#? Похоже, вы можете использовать SIP для приложения c#, и ничего для JMF?


RTP-это уровень приложения, UDP-это транспортный уровень, это не тот уровень! Википедия помогает объяснить это подробно. Таким образом, ваши данные отправляются как поток RTP в UDP "Frame"

небольшой обзор...

приложений:

* 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)

Link layer

* ARP/InARP
* NDP
* OSPF
* Tunnels
      o L2TP
* PPP
* Media access control
      o Ethernet
      o DSL
      o ISDN
      o FDDI
* (more)