Java 使用RTP在JMF中实现播放器
我有一个问题,我已经挣扎了一周的大部分时间,并尝试了至少10种不同的实现,但似乎都失败了。一定有什么我不明白的 我使用jmf通过rtp传输音频。问题是,客户端播放器永远不会意识到,因此,代码会被阻塞,并且不会播放任何内容 变送器的代码如下所示:Java 使用RTP在JMF中实现播放器,java,audio,stream,rtp,jmf,Java,Audio,Stream,Rtp,Jmf,我有一个问题,我已经挣扎了一周的大部分时间,并尝试了至少10种不同的实现,但似乎都失败了。一定有什么我不明白的 我使用jmf通过rtp传输音频。问题是,客户端播放器永远不会意识到,因此,代码会被阻塞,并且不会播放任何内容 变送器的代码如下所示: import java.io.File; import java.io.IOException; import javax.media.DataSink; import javax.media.Format; import javax.media.Man
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);
}
}
}
}
发射机启动正常,一切正常,一切正常。所以我启动了接收器,它就在
while (player.getState() != Player.Realized)
让我非常沮丧的是,这是一个简单的测试用例,这些文件直接从示例中改编而来。此外,它们尽可能简单,但它们似乎仍然不起作用
任何帮助都将不胜感激!
谢谢大家! 嘿,我能理解这种挫折感。我自己也有类似的问题。无论如何,我有几乎相同的发射机,但在接收机中,我使用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语句可以让您了解播放器的情况。我也曾经遇到过同样的问题。它坚持“实现”状态。你的程序只需要稍微改变一下。你知道在读了答案D后,你会撞到你的桌子 也就是说,不要键入“127.0.0.1”,而是键入您的IP地址。就这样
然后运行它。您最好听听控制器事件,看看发生了什么
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");
}
}
}