2012-04-02 3 views
6

RTP 형식의 JMF 2.1.1e를 사용하여 오디오를 캡처하고 스트리밍하고 싶습니다. 나는 간단한 송신기를 썼다. 나는 오디오를 송수신 할 수있다. 그러나 Wireshark에서 보았을 때 패킷을 UDP로 보았습니다. 누구든지 저에게 문제를 지적 해주십시오.jmf를 사용하여 스트리밍 할 때 Wireshark의 RTP가 아닌 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(); 
     } 
    } 
} 

부적절하거나 불분명 한 것이 있으면 부탁드립니다. 미리 감사드립니다. :)

명확한 설명 : 나는 RTP 스트리밍 C# 코드의 peice 있습니다. 그리고 내가 Wireshark를를 사용하여 데이터를 캡처 할 때, 나는 RTP로 볼 수 있습니다,하지만 난 UDP로 보여 JMF 와이어 샤크에서 데이터 스트림을 캡처 할 때 문제입니다. 제 질문은, 왜죠?

나는 UDP와 RTP의 차이점을 안다.

+0

문제는 CONTENT_DESCRIPTOR에 있다고 생각합니다. raw-rtp입니다. – shibli049

+0

현재 직면 한 문제를 제외하고 코드가 실행 중임을 이해합니다. JMF 소스 코드에서 JMF가 Osbcure와 같은 CONTENT_DESCRIPTOR를 사용할 때 Processor 클래스를 구현하는 방법을 살펴볼 필요가 있습니다. 이것은 C# 코드와 Java JMF 코드의 차이 일 수 있습니다. C# 버전에 어떤 스트리밍 라이브러리를 사용하고 있는지 알려면주의하십시오. – ecle

+0

@eee : C# 프로젝트는 pjsipDll을 사용하고 있습니다. wireshark에서 패킷을 테스트하기 위해 친구로부터 가져 왔습니다. C#으로 작업하지 않았습니다. C#에 대한 자세한 내용을 알려 드릴 수 없습니다. – shibli049

답변

5

난 당신이 RTP 패킷을 와이어 샤크에서 RTP 패킷으로 인식되지 않는 이유를 알고 싶어 제대로 질문을 이해합니다. wireshark에 RTP 세션에 대한 충분한 정보가없는 경우 내 경험상이 경우가 될 수 있습니다.

예 : 1) RTSP 또는 SIP와 SDP를 사용하여 설정 한 RTP 세션을 스니핑하면 wireshark가 RTP를 감지합니다. 2) 그러나 로컬 SDP 설명을 사용하여 세션을 설정하는 다른 응용 프로그램에서는 패킷이 UDP로 표시됩니다. 두 번째 시나리오에서 wireshark는 RTP 패킷을보고 있지만 RTP로 분류하기위한 정보가 부족합니다. RTP는 일반적으로 UDP의 최상위에 위치하고 있기 때문에 wireshark는 UDP 패킷을 분류 할 수 있으므로 분류됩니다.

참고로, RTP 인 스트림에서 패킷을 선택할 수 있으며 "다른 이름으로 디코딩"을 선택할 수 있습니다. 그런 다음 프로토콜 목록에서 해당 스트림 (해당하는 경우 다른 RTCP)의 RTP를 선택하면 wireshark가 패킷을 RTP로 표시하고 패킷 정보를 볼 수 있습니다.

이것이 특정한 경우의 이유인지는 모르겠지만 JMF와 C# 예제간에 신호 차이가있을 수 있습니까? C# 응용 프로그램 용으로 SIP를 사용하고 JMF 용 SIP를 사용하지 않는 것 같습니다.

+0

고마워, 그게 내가 찾고있는 해답이야, 나를 위해 완벽하게 일했다. 이제 wireshark는 패킷을 RTP로 인식합니다. 그리고 네, C#에서는 SIP이고 JMF에서는 아무것도 안됩니다. :) – shibli049

8

RTP는 응용 프로그램 계층, UDP는 전송 계층, 은 같은 수준이 아닙니다! 위키 백과에서 자세히 설명합니다. 그래서 데이터 작업 ... UDP "프레임"

작은 개요 내에서 RTP 스트림으로 전송됩니다

응용 프로그램 레이어 :

* 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