java jmf播放声音_java – 使用RTP在JMF中实现播放器
我有一个问题,我在一周的大部分时间里一直在努力,并尝试过至少10种不同的实现,但似乎都失败了.必须有一些我不理解的东西.
我正在使用jmf通过rtp传输音频.问题是客户端玩家永远不会意识到代码块,因此也没有任何东西可以播放.
Transmitter的代码如下:
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)
令我非常沮丧的是,这是一个简单的测试用例,这些文件可以直接从示例中进行调整.此外,它们尽可能简单,但它们似乎仍无法正常工作.
任何帮助将不胜感激!
谢谢!
java jmf播放声音_java – 使用RTP在JMF中实现播放器相关推荐
- java 媒体框架_Java 媒体框架 之 JMF
如果想要使用Java中的Swing播放音乐,视频,包括录音,截取录像等等,就要用到Java的媒体框架JMF. Java媒体框架(JMF)使你能够编写出功能强大的多媒体程序,却不用关心底层复杂的实现细节 ...
- 深圳java培训:使用原生JS重构简单的音乐播放器
深圳java培训:使用原生JS重构简单的音乐播放器 上次,我们使用Jquery开发了一款简单的音乐播放器(如下图), 后来学生希望能够用原生的JS重构一次, 那么,下面就来看看如何使用原生的JS重构吧 ...
- Java运用jna、vlcj实现音乐和视频的播放器1-主界面设计
一.播放器主框架 public class MainFrame {public JFrame frame;public int width = 100;public int height = 350; ...
- Java多媒体框架JFM中的播放器
原文: Overview Package Class Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES NO FRAMES SUMMARY ...
- java 正则 捕获_Java通过正则表达式捕获组中的文本
1.简介 Java 正则表达式如何捕获组中的文本 ?--请看下文. 2.代码 /** * 版权所有 编程十万个怎么办(www.tah1986.com) */ public class Capturin ...
- 实用Java程序设计教程_java程序设计实用教程 书中代码.pdf
例2-1 Example2_1.java public class Example2_1 { public static void main(String args[]) { Rect rectang ...
- java reactor框架_Java反应式框架Reactor中的Mono和Flux
1. 前言 最近写关于响应式编程的东西有点多,很多同学反映对Flux和Mono这两个Reactor中的概念有点懵逼.但是目前Java响应式编程中我们对这两个对象的接触又最多,诸如Spring WebF ...
- java pdf 书签_Java 展开或折叠PDF中的书签
PDF中的书签功能可快速定位到指定阅读位置.对多层书签可根据阅读喜好设置层级展开或折叠.本文将通过Java程序代码介绍如何来实现PDF书签展开或折叠. 程序环境 Spire.Pdf.jar( 免费版3 ...
- java按钮退出_java – 如何在此程序中添加退出按钮?怎么样“清楚”?
我需要添加一个"清除计算器"的按钮,以及一个退出butPanel上的程序的按钮.它也需要是非常基本的 Java代码,因为我是初学者,并且有一个糟糕的comp.sci.老师.我有一个 ...
最新文章
- ArcGIS 9.3 安装之 Server的安装
- 解决html5 audio iphone,ipd,safari不能自动播放问题
- 【深入Java虚拟机】之四:类加载机制
- dbnull和null_NULL和DBNull的区别分析
- 监视和管理GlassFish 3的多种方法
- 检测到会话cookie中缺少HttpOnly属性
- 利用计算机管理分区,win7增加磁盘分区教学 利用磁盘管理增加分区
- 世界大学生超算竞赛正式启动,再次引发全球关注
- C结构体之位域(位段)
- 如何取消计算机的自动更新,电脑自动更新如何取消 电脑自动更新取消方法
- C#的变迁史 - C# 5.0 之其他增强篇
- iOS之摇一摇功能实现
- [2018.10.23 T1] 战争
- 【读书笔记《Bootstrap 实战》】4.企业网站
- timeroc 最优最佳截断值特异度(specificity)与灵敏度(sensitivity)
- Java通过http协议下载文件并写入字节流的方法
- 双系统启动引导项配置
- 液晶显示屏的C语言编码,AT89C51单片机驱动液晶显示汉字C语言
- 利用镜像解决一系列下载速度慢的问题
- 一款基本靠谱,略微出圈的2021十大科技预测