저는 일주일 중 많은 시간 동안 고민 중이며 적어도 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)
에서 반복합니다. 더 나아가서, 나는 그것들을 만들 수있는만큼 간단하지만 아직 그들은 작동하지 않는 것처럼 보인다.
도움이 될 것입니다. 감사합니다!
ControllerEvent를 듣고 무슨 일이 일어나는지 잘 알 것입니다. – jogabonito