2011-10-09 3 views
4

저는 일주일 중 많은 시간 동안 고민 중이며 적어도 10 가지 구현을 시도했지만 모두 실패한 것으로 보입니다. 내가 이해하지 못하는 것이 있어야합니다.RTP를 사용하는 JMF의 플레이어 구현

rtp를 통해 오디오를 전송하는 데 jmf를 사용하고 있습니다. 문제는 클라이언트 플레이어가 코드 블록을 전혀 몰랐기 때문에 결국 코드 블록이 재생되지 않으며 아무 것도 재생되지 않는다는 것입니다.

다음과 같이 송신기에 대한 코드는 다음과 같습니다

import java.io.File; 
import java.io.IOException; 
import javax.media.DataSink; 
import javax.media.Format; 
import javax.media.Manager; 
import javax.media.MediaLocator; 
import javax.media.NoProcessorException; 
import javax.media.NotRealizedError; 
import javax.media.Processor; 
import javax.media.control.FormatControl; 
import javax.media.control.TrackControl; 
import javax.media.format.AudioFormat; 
import javax.media.protocol.ContentDescriptor; 
import javax.media.protocol.DataSource; 

public class RTPTransmitter 
{ 

/** 
* @param args 
*/ 
public static void main(String[] args) 
{ 
    File f = new File("streamtest.wav"); 

    Format format; 

    format = new AudioFormat(AudioFormat.ULAW_RTP, 8000, 8, 1); 

    Processor processor = null; 
    try 
    { 
     processor = Manager.createProcessor(f.toURI().toURL()); 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
     System.exit(-1); 
    } catch (NoProcessorException e) 
    { 
     e.printStackTrace(); 
     System.exit(-1); 
    } 

    // configure the processor 
    processor.configure(); 

    while (processor.getState() != Processor.Configured) 
    { 
     try 
     { 
      Thread.sleep(100); 
     } catch (InterruptedException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    processor.setContentDescriptor(new ContentDescriptor(ContentDescriptor.RAW_RTP)); 

    TrackControl track[] = processor.getTrackControls(); 

    boolean encodingOk = false; 

    // Go through the tracks and try to program one of them to 
    // output gsm data. 

    for (int i = 0; i < track.length; i++) 
    { 
     if (!encodingOk && track[i] instanceof FormatControl) 
     { 
      if (((FormatControl) track[i]).setFormat(format) == null) 
      { 

       track[i].setEnabled(false); 
      } else 
      { 
       encodingOk = true; 
      } 
     } else 
     { 
      // we could not set this track to gsm, so disable it 
      track[i].setEnabled(false); 
     } 
    } 

    //realize the processor 
    processor.realize(); 
    while(processor.getState() != processor.Realized){ 
     try 
     { 
      Thread.sleep(100); 
     } catch (InterruptedException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    // At this point, we have determined where we can send out 
    // gsm data or not. 
    if (encodingOk) 
    {  
     // get the output datasource of the processor and exit 
     // if we fail 
     DataSource ds = null; 

     try 
     { 
      ds = processor.getDataOutput(); 
     } catch (NotRealizedError e) 
     { 
      e.printStackTrace(); 
      System.exit(-1); 
     } 

     // hand this datasource to manager for creating an RTP 
     // datasink our RTP datasink will multicast the audio 
     try 
     { 
      String url = "rtp://127.0.0.1:8000/audio/1"; 

      MediaLocator m = new MediaLocator(url); 

      DataSink d = Manager.createDataSink(ds, m); 
      d.open(); 
      d.start(); 

      System.out.println("Starting processor"); 
      processor.start(); 
      System.out.println("Processor Started"); 
      Thread.sleep(30000); 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
      System.exit(-1); 
     } 
    } 

} 

} 

그리고 수신기에 대한 코드는 다음과 같습니다

import java.io.IOException; 
import java.net.MalformedURLException; 
import javax.media.Manager; 
import javax.media.MediaLocator; 
import javax.media.NoPlayerException; 
import javax.media.Player; 

public class RTPReceiver 
{ 

/** 
* @param args 
*/ 
public static void main(String[] args) 
{ 
    String url = "rtp://127.0.0.1:8000/audio/1"; 

    MediaLocator mrl = new MediaLocator(url); 

    // Create a player for this rtp session 
    Player player = null; 
    try 
    { 
     player = Manager.createPlayer(mrl); 
    } catch (NoPlayerException e) 
    { 
     e.printStackTrace(); 
     System.exit(-1); 
    } catch (MalformedURLException e) 
    { 
     e.printStackTrace(); 
     System.exit(-1); 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
     System.exit(-1); 
    } 

    if (player != null) 
    { 
     System.out.println("Player created."); 
     player.realize(); 
     // wait for realizing 
     while (player.getState() != Player.Realized) 
     { 
      try 
      { 
       Thread.sleep(10); 
      } catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
     System.out.println("Starting player"); 
     player.start(); 
    } else 
    { 
     System.err.println("Player won't create."); 
     System.exit(-1); 
    } 

    System.out.println("Exiting."); 
} 

} 

송신기는 벌금, 모든 것이 시작됩니다 시작하고, 모두가 보인다 작업. 그래서 나는 수화기를 시작하고 그냥 나 한테 무슨 너무 좌절하는이 간단한 테스트 케이스가이 파일을 직접 예에서 적응한다는 것이다

while (player.getState() != Player.Realized) 

에서 반복합니다. 더 나아가서, 나는 그것들을 만들 수있는만큼 간단하지만 아직 그들은 작동하지 않는 것처럼 보인다.

도움이 될 것입니다. 감사합니다!

+0

ControllerEvent를 듣고 무슨 일이 일어나는지 잘 알 것입니다. – jogabonito

답변

4

나는 좌절감을 이해할 수 있습니다. 나는 나 자신과 비슷한 문제를 안고 있었다. 어쨌든 나는 거의 동일한 송신기를 가지고 있지만 수신기에서 나는 플레이어가 깨어 났을 때들을 수있는 ControlListener를 사용하고 있습니다.

public AudioRTPRecv() { 
    MediaLocator mrl= new MediaLocator("rtp://192.168.1.100:49151/audio/1"); 

    // Create a player for this rtp session 
    try { 
     player = Manager.createPlayer(mrl); 
    } catch (Exception e) { 
     System.err.println("Error:" + e); 
     return; 
    } 

    if (player != null) { 
     player.addControllerListener(this); 
     player.realize(); 
    } 
} 

public synchronized void controllerUpdate(ControllerEvent ce) { 
    System.out.println(ce); 
    if(ce instanceof TransitionEvent) { 
     if (((TransitionEvent)ce).getCurrentState() == Processor.Realized) { 
      player.start(); 
      System.out.println("starting player now"); 
     } 
    } 
} 

이렇게하면 controllerUpdate 메서드의 print 문에서 플레이어와 관련된 작업을 수행 할 수 있다는 이점이 있습니다.

3

나는 또한 동일한 문제를 겪었습니다. 그것은 "깨닫는"상태를 고수합니다. 귀하의 프로그램은 약간의 변화가 필요합니다. 솔루션을 읽은 후에 테이블을 부딪 칠 것입니다. D

즉, "127.0.0.1"을 입력하는 대신 IP 주소를 입력하십시오. 그게 전부 야!

그리고 실행하십시오.