2012-04-02 11 views
6

मैं आरटीपी प्रारूप में जेएमएफ 2.1.1e का उपयोग कर ऑडियो कैप्चर और स्ट्रीम करना चाहता हूं। मैंने एक साधारण ट्रांसमीटर लिखा, मैं ऑडियो भेज और प्राप्त कर सकता हूं। लेकिन जब मैंने वायर्सहार्क में देखा, तो मैंने पैकेट को यूडीपी के रूप में देखा। क्या कोई मुझे समस्या से बाहर इंगित कर सकता है, कृपया।यह यूडीपी क्यों है, जब मैं जेएमएफ का उपयोग कर स्ट्रीम करता हूं तो वायरसर्क में आरटीपी नहीं?

और यहां मेरा कार्य ऑडियो कैप्चर और ट्रांसमिट के लिए ज़िम्मेदार है।

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

और कृपया पूछें, अगर आपको कुछ अनुचित या अस्पष्ट लगता है। अग्रिम धन्यवाद। :)

स्पष्टीकरण: मैं आरटीपी स्ट्रीमिंग के लिए सी # कोड का एक टुकड़ा है। और जब मैं wireshark का उपयोग कर डेटा पर कब्जा, मैं उन्हें के रूप में देख सकते हैं आरटीपी, लेकिन समस्या यह है जब मैं उन्हें के रूप में यूडीपी दिखाने से JMF wireshark डाटा प्रवाह पर कब्जा। और मेरा सवाल है, क्यों?

मुझे यूडीपी और आरटीपी के बीच का अंतर पता है।

+0

मुझे लगता है कि समस्या CONTENT_DESCRIPTOR पर है, यह कच्ची-आरटीपी है। – shibli049

+0

मैं समझता हूं कि आप जिस समस्या का सामना कर रहे हैं उसे छोड़कर आप कोड चला रहे हैं। हमें जेएमएफ स्रोत कोड में देखने की ज़रूरत है कि जेएमएफ प्रोसेसर क्लास को कैसे लागू करता है जब यह CONTENT_DESCRIPTOR का उपयोग करता है जैसे ओस्बकुर ने क्या कहा है। शायद यह सी # कोड और जावा जेएमएफ कोड के बीच अंतर है। सी # संस्करण के लिए आप किस स्ट्रीमिंग लाइब्रेरी का उपयोग कर रहे हैं यह बताने की देखभाल करें? – ecle

+0

@eee: सी # प्रोजेक्ट pjsipDll का उपयोग कर रहा है, मैंने इसे सिर्फ एक दोस्त से वायरसहार्क में पैकेट का परीक्षण करने के लिए लाया, और मुझे सी # के साथ काम करने के लिए उपयोग नहीं किया जाता है। तो, आपको सी # पर कोई और जानकारी नहीं दे सका। आपके अच्छे स्पष्टीकरण के लिए – shibli049

उत्तर

5

अगर मैं आपके सवाल का सही ढंग से समझ आप को पता है क्यों आरटीपी पैकेट wireshark में आरटीपी पैकेट के रूप में मान्यता प्राप्त नहीं हैं चाहता हूँ। मेरे अनुभव में यह मामला हो सकता है अगर वायरशर्क में आरटीपी सत्र के बारे में पर्याप्त जानकारी नहीं है।

उदाहरण के लिए: 1) यदि मैं एक आरटीपी सत्र स्नीफ करता हूं जिसे आरटीएसपी या एसआईपी और एसडीपी का उपयोग करके सेटअप किया गया है, तो वायरशर्क आरटीपी का पता लगाएगा। 2) हालांकि, एक अन्य एप्लिकेशन में जिसमें मैं स्थानीय एसडीपी विवरणों का उपयोग करके सत्र स्थापित कर रहा था, पैकेट यूडीपी के रूप में दिखाई देते हैं। दूसरे परिदृश्य में वायरशर्क आरटीपी पैकेट देखता है लेकिन उन्हें आरटीपी के रूप में वर्गीकृत करने के लिए जानकारी की कमी है। चूंकि आरटीपी आम तौर पर यूडीपी के शीर्ष पर बैठता है और वायरशर्क यूडीपी पैकेट को वर्गीकृत कर सकता है, इसलिए उन्हें वर्गीकृत किया जाता है।

एफवाईआई, फिर आप आरटीपी से स्ट्रीम से एक पैकेट चुन सकते हैं, और "जैसा डीकोड" चुनें। फिर उचित स्ट्रीम (और लागू होने पर दूसरे के लिए आरटीसीपी) के लिए प्रोटोकॉल सूची से आरटीपी का चयन करें, और फिर वायरशर्क रॉकेट को आरटीपी के रूप में दिखाएगा और आप पैकेट जानकारी देख पाएंगे।

मुझे यकीन नहीं है कि यह आपके विशिष्ट मामले में कारण है, लेकिन शायद आपके जेएमएफ और आपके सी # उदाहरण के बीच एक संकेत अंतर है? ऐसा लगता है कि आप सी # अनुप्रयोग के लिए एसआईपी का उपयोग कर रहे हैं, और जेएमएफ के लिए कुछ भी नहीं?

+0

धन्यवाद, यही वह जवाब है जिसे मैं ढूंढ रहा हूं, पूरी तरह से मेरे लिए काम किया। अब wireshark पैकेट को आरटीपी के रूप में पहचानते हैं। और हाँ, सी # के लिए एसआईपी और जेएमएफ के लिए कुछ भी नहीं। :) – shibli049

8

आरटीपी आवेदन परत है, यूडीपी परिवहन परत है, जो एक ही स्तर नहीं है! विकिपीडिया विस्तार से विस्तार से मदद करता है। तो अपने डेटा एक यूडीपी "फ़्रेम"

एक छोटा सा सिंहावलोकन के भीतर एक आरटीपी धारा के रूप में भेज रहा है ...

आवेदन परतों:

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

+1। लेकिन, मैं उन्हें पहले ही जानता था। मैंने अपने प्रश्न में एक स्पष्टीकरण दिया। क्या आप कृपया देख सकते हैं। और मुझे एक जवाब दो। – shibli049

संबंधित मुद्दे

 संबंधित मुद्दे