2012-04-02 20 views
6

Quiero capturar y transmitir audio usando JMF 2.1.1e en formato RTP. Escribí un transmisor simple, puedo transmitir y recibir el audio. Pero cuando vi en Wireshark, vi los paquetes como UDP. ¿Alguien puede señalarme el problema, por favor?¿Por qué es UDP, no RTP en Wireshark cuando hago stream usando jmf?

Y aquí está mi función responsable de la captura y transmisión de audio.

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(); 
     } 
    } 
} 

Y por favor pregunte, si encuentra algo impropio o vago. Gracias de antemano. :)

Aclaración: Tengo un pedazo de código C# para RTP streaming. Y cuando capture a los datos utilizando Wireshark, puedo ver como RTP, pero el problema es cuando capture a la corriente de datos de JMF Wireshark mostrarlos como UDP. Y mi pregunta es, ¿por qué?

Conozco la diferencia entre UDP y RTP.

+0

Creo que el problema está en CONTENT_DESCRIPTOR, es raw-rtp. – shibli049

+0

Entiendo que su código se está ejecutando, excepto por el problema que está enfrentando en este momento. Necesitamos ver en el código fuente de JMF cómo JMF implementa la clase Processor cuando usa el CONTENT_DESCRIPTOR como lo dijo Osbcure. Quizás esta es la diferencia entre los códigos C# y Java JMF. ¿Le importa saber qué biblioteca de transmisión está utilizando para la versión de C#? – ecle

+0

@eee: el proyecto C# está usando pjsipDll, simplemente lo traje de un amigo para probar los paquetes en wireshark, y no estoy acostumbrado a trabajar con C#. Por lo tanto, no podría darle más detalles sobre C#. – shibli049

Respuesta

5

Si entiendo bien su pregunta desea saber por qué los paquetes RTP no se reconocen como paquetes RTP en Wireshark. En mi experiencia, este puede ser el caso si wireshark no tiene suficiente información sobre la sesión RTP.

Por ejemplo: 1) si olfateo una sesión RTP que se ha configurado utilizando RTSP o SIP y SDP, wireshark mostrará detectar RTP. 2) Sin embargo, en otra aplicación en la que estaba configurando la sesión utilizando descripciones SDP locales, los paquetes aparecen como UDP. En el segundo escenario, wireshark ve los paquetes RTP pero carece de la información para clasificarlos como RTP. Como RTP generalmente se encuentra en la parte superior de UDP y wireshark puede clasificar paquetes UDP, se clasifican como tales.

FYI, a continuación, puede seleccionar un paquete de la secuencia que sepa es RTP, y seleccione "Descodificar como". Luego, seleccione RTP de la lista de protocolos para la transmisión apropiada (y RTCP para la otra, si corresponde) y, a continuación, wireshark mostrará los paquetes como RTP y podrá ver la información del paquete.

No estoy seguro de si este es el motivo en su caso específico, pero tal vez hay una diferencia de señalización entre su JMF y su ejemplo C#? Parece que podría estar utilizando SIP para la aplicación C#, y nada para el JMF.

+0

Gracias, esa es la respuesta que estoy buscando, funcionó perfectamente para mí. Ahora wireshark reconoce los paquetes como RTP. Y sí, SIP para C# y nada para JMF. :) – shibli049

8

RTP es la capa de aplicación, UDP es la capa de transporte, que no tiene el mismo nivel. Wikipedia ayuda a explicar eso en detalle. lo que sus datos se envía como un flujo RTP dentro de un "marco" UDP

Una pequeña reseña ...

capas de aplicación:

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

la capa de transporte

* TCP 
* UDP 
* DCCP 
* SCTP 
* RSVP 
* (more) 

capa de Internet

* IP 
     o IPv4 
     o IPv6 
* ICMP 
* ICMPv6 
* ECN 
* IGMP 
* IPsec 
* (more) 

capa de Enlace

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

+1 para su buena explicación. Pero, ya los conocía. Di una aclaración en mi pregunta. ¿Podrías ver por favor? Y dame una respuesta. – shibli049

Cuestiones relacionadas