2012-04-02 8 views
6

Desidero acquisire e trasmettere audio utilizzando JMF 2.1.1e in formato RTP. Ho scritto un semplice trasmettitore, posso trasmettere e ricevere l'audio. Ma quando ho visto in Wireshark, ho visto i pacchetti come UDP. Qualcuno può indicarmi il problema, per favore.Perché è UDP, non RTP in Wireshark quando eseguo lo streaming utilizzando jmf?

E questa è la mia funzione responsabile per l'acquisizione e la trasmissione 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(); 
     } 
    } 
} 

E chiedere, se si trova qualcosa di improprio o vago. Grazie in anticipo. :)

Chiarimento: Ho un pezzo di codice C# per lo streaming RTP. E quando ho catturare i dati utilizzando Wireshark, posso vedere loro come RTP, ma il problema è quando ho catturare il flusso di dati da JMF Wireshark mostrare loro come UDP. E la mia domanda è, perché?

Conosco la differenza tra UDP e RTP.

+0

Penso che il problema sia su CONTENT_DESCRIPTOR, è raw-rtp. – shibli049

+0

Capisco che il tuo codice è in esecuzione tranne per il problema che stai affrontando proprio ora. Abbiamo bisogno di vedere nel codice sorgente JMF come JMF implementa la classe Processor quando usa CONTENT_DESCRIPTOR come quello che ha detto Osbcure. Forse questa è la differenza tra i codici C# e i codici Java JMF. Ti interessa sapere quale libreria di streaming stai usando per la versione C#? – ecle

+0

@eee: Il progetto C# sta usando pjsipDll, l'ho appena portato da un amico per testare i pacchetti in wireshark, e non sono abituato a lavorare con C#. Quindi, non potrei fornirti ulteriori dettagli su C#. – shibli049

risposta

5

Se ho capito la tua domanda correttamente volete sapere il motivo per cui i pacchetti RTP non sono riconosciuti come i pacchetti RTP in Wireshark. Nella mia esperienza questo può essere il caso se wireshark non ha abbastanza informazioni sulla sessione RTP.

Ad esempio: 1) se si annota una sessione RTP che è stata configurata utilizzando RTSP o SIP e SDP, quindi wireshark mostrerà il rilevamento RTP. 2) Tuttavia in un'altra applicazione in cui stavo configurando la sessione utilizzando le descrizioni SDP locali, i pacchetti si presentano come UDP. Nel secondo scenario wireshark vede i pacchetti RTP ma manca delle informazioni per classificarli come RTP. Poiché RTP di solito si trova sulla parte superiore di UDP e wireshark è in grado di classificare i pacchetti UDP, sono classificati come tali.

FYI, è quindi possibile selezionare un pacchetto dal flusso che si conosce è RTP e selezionare "Decodifica come". Quindi selezionare RTP dall'elenco dei protocolli per il flusso appropriato (e RTCP per l'altro se applicabile), quindi wireshark mostrerà i pacchetti come RTP e sarà possibile visualizzare le informazioni sul pacchetto.

Non sono sicuro se questo è il motivo nel tuo caso specifico, ma forse c'è una differenza di segnalazione tra il tuo JMF e il tuo esempio C#? Sembra che tu stia usando SIP per l'applicazione C# e nulla per quello JMF?

+0

Grazie, questa è la risposta che sto cercando, perfettamente funzionante per me. Ora wireshark riconosce i pacchetti come RTP. E sì, SIP per C# e niente per JMF. :) – shibli049

8

RTP è il livello applicazione, UDP è il livello di trasporto, che non è lo stesso livello! Wikipedia aiuta a spiegarlo in dettaglio. Quindi i dati sono invia come un flusso RTP UDP all'interno di un "Frame"

una piccola panoramica ...

livelli applicativi:

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

livello di trasporto

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

strato Internet

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

strato di collegamento

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

+1 per la tua bella spiegazione. Ma li conoscevo già. Ho dato un chiarimento nella mia domanda. Potresti vedere per favore. E dammi una risposta. – shibli049

Problemi correlati