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

Я хочу записывать и передавать аудио с помощью 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 wirehark. показать их как UDP. И у меня вопрос, почему?

Я знаю разницу между UDP и RTP.


person shibli049    schedule 02.04.2012    source источник
comment
Думаю, проблема в CONTENT_DESCRIPTOR, это raw-rtp.   -  person shibli049    schedule 05.04.2012
comment
Я понимаю, что ваш код работает, за исключением проблемы, с которой вы столкнулись прямо сейчас. Нам нужно увидеть в исходном коде JMF, как JMF реализует класс Processor, когда он использует CONTENT_DESCRIPTOR, как сказал Osbcure. Возможно, в этом разница между кодами C # и кодами Java JMF. Не хотите сказать, какую потоковую библиотеку вы используете для версии C #?   -  person ecle    schedule 11.04.2012
comment
@eee: В проекте C # используется pjsipDll, я только что принес его от друга, чтобы протестировать пакеты в wirehark, и я не привык работать с C #. Итак, я не могу дать вам более подробную информацию о C #.   -  person shibli049    schedule 11.04.2012


Ответы (2)


Если я правильно понял ваш вопрос, вы хотите знать, почему пакеты RTP не распознаются как пакеты RTP в wirehark. По моему опыту, это может иметь место, если wirehark не имеет достаточно информации о сеансе RTP.

Например: 1) если я прослушиваю сеанс RTP, который был настроен с использованием RTSP или SIP и SDP, то wirehark покажет обнаружение RTP. 2) Однако в другом приложении, в котором я настраивал сеанс с использованием локальных описаний SDP, пакеты отображаются как UDP. Во втором сценарии WireShark видит пакеты RTP, но не имеет информации, чтобы классифицировать их как RTP. Поскольку RTP обычно находится поверх UDP, а wirehark может классифицировать пакеты UDP, они классифицируются как таковые.

К вашему сведению, затем вы можете выбрать пакет из потока, который, как вы знаете, является RTP, и выбрать «Расшифровать как». Затем выберите RTP из списка протоколов для соответствующего потока (и RTCP для другого, если применимо), а затем wirehark покажет пакеты как RTP, и вы сможете увидеть информацию о пакете.

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

person Ralf    schedule 11.04.2012
comment
Спасибо, это ответ, который я ищу, отлично сработал для меня. Теперь wirehark распознает пакеты как RTP. И да, SIP для C # и ничего для JMF. :) - person shibli049; 11.04.2012

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)
person Willi    schedule 10.04.2012
comment
+1 за ваше красивое объяснение. Но я их уже знал. Я дал пояснение по своему вопросу. Не могли бы вы увидеть, пожалуйста. И дайте мне ответ. - person shibli049; 11.04.2012