基于red5 dsj 的java 处理视频流和一些疑问
最近夭折了一个项目,由于我预研失败,同时我将被惩罚,被外派去其他公司干活,干完再回来。下面来说说这个项目。最后再总结为什么失败。基于red5的视频聊天,桌面共享。下图是简单的逻辑图
?做视频聊天,做桌面共享,而且要在手机端也能显示出来,因此采用red5 这个开源的流媒体服务器。?公司的产品是典型的基于服务的多客户端模式。简单的说是一个java后台发布服务,客户端有windows桌面版(java);mac桌面(java);android;ios,由于是自动化办公,所以集成了im,office,网盘等等功能。?下面看看怎么玩的。1 ?dsj 这是微软的dictShow的java 版,免费使用,非开源下载下来以后里面有个dsj.dll放如c盘 system32里面。【简单调用本地摄像头】
?2 red5-client? ? red5提供了2个jar ,一个是server.一个是client 用来连接red5服务器。实例【捕获red5 demo publisher 的视频流】首先打开red5 ->demo->publisher?
?点击connect,翻开video页签,选择摄像头,点击start.最后点击public
?【使用代码捕获】使用上图中的streamName?3 dsj 中显示捕获的视频流||||||dsj调用本地摄像头向red5 发送视频流package com.oatos.red5;import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;import javax.swing.JFrame;import de.humatic.dsj.DSCapture;import de.humatic.dsj.DSFilterInfo;import de.humatic.dsj.DSFiltergraph;import de.humatic.dsj.DSGraph;import de.humatic.dsj.DSJUtils;import de.humatic.dsj.DSMovie;import de.humatic.dsj.JSampleBuffer;import de.humatic.dsj.SampleBuffer;import de.humatic.dsj.SwingMovieController;import de.humatic.dsj.sink.RTMPSink;import de.humatic.dsj.src.RTMPSource;import de.humatic.dsj.src.Source;import de.humatic.dsj.src.rtmp.ConnectionParameter;import de.humatic.dsj.src.rtmp.RTMPMessage;import de.humatic.dsj.src.rtp.RTPChannel;public class DSJRTMP implements java.beans.PropertyChangeListener {private DSCapture graph;private String ip="localhost";private int port=1935;private String app="oflaDemo";private String url = "rtmp://localhost/oflaDemo";private String streamName = "stream1371608283848";public static void main(String[] args) throws Exception {//new DSJRTMP().TestRTMP();new DSJRTMP().testRTMPSoucre();}public JFrame addFrame(){JFrame f = new JFrame("dsj RTMP");f.pack();f.setVisible(true);f.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);return f;}/*** * 本地摄像头往 red5 发送视频流 * @throws Exception */public void TestRTMP() throws Exception {Source source = new Source();// source.createGraph(arg0);//javax.swing.JFrame f = new javax.swing.JFrame("dsj SimpleCapture");DSFilterInfo[][] dsi = DSCapture.queryDevices();System.out.println(dsi);/** this sample only uses video **/graph = new DSCapture(DSFiltergraph.DD7, dsi[0][0], false, DSFilterInfo.doNotRender(), this);//graph.createBufferStrategy(1024);System.out.println(graph);addFrame().add(java.awt.BorderLayout.CENTER, graph.asComponent());// f.add(java.awt.BorderLayout.SOUTH, new SwingMovieController(graph)); RTMPSink rtmpsink = new RTMPSink(graph,url,streamName,dsi[0][0],dsi[1][0],-1); System.out.println(rtmpsink);// rtmpsink.sendRTMP(arg0);// DsSampleBuffer sb = new JSampleBuffer();// rtmpsink.sampleReceived();// RTPChannel channel = new RTPChannel();// RTMPMessage msg = new RTMPMessage();////f.pack();//f.setVisible(true);//f.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);}/** * 连接red5 接收视频流 * @throws Exception */void testRTMPSoucre() throws Exception{//ConnectionParameter params = new ConnectionParameter("", nested, AMF.OBJECT, ConnectionParameter.APPEND);java.beans.PropertyChangeListener pc = new java.beans.PropertyChangeListener(){@Overridepublic void propertyChange(PropertyChangeEvent evt) {System.out.println("----"+evt);}};//RTMPSource rs = new RTMPSource(ip,port,app,streamName,pc);//RTMPSource rs = new RTMPSource(url,"hobbit_vp6.flv", -1, this);RTMPSource rs = new RTMPSource(url,streamName, -1, this);System.out.println(rs.getPath());System.out.println(rs.getMaxTimeLoaded());System.out.println(rs.getMediaTypes());//DSGraph ds = rs.createGraph(DSFiltergraph. VIDEO_BUFFER_REQUEST);//System.out.println(rs.getBuffered());//System.out.println(ds);DSMovie dm = new DSMovie("rtmp://localhost/oflaDemo",DSFiltergraph.DD7,this);//DSMovie dm = new DSMovie("F:/install_soft/red5/webapps/oflaDemo/streams/hobbit_vp6.flv",DSFiltergraph.DD7,this);//addFrame().add(java.awt.BorderLayout.CENTER,dm.asComponent());//JFrame f = new JFrame("dsj RTMP");addFrame().add(java.awt.BorderLayout.CENTER, dm.asComponent());//f.pack();//f.setVisible(true);//f.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);}@Overridepublic void propertyChange(PropertyChangeEvent evt) {switch (DSJUtils.getEventType(evt)) {}}}这个类是有问题的,接受的到的流无法显示,可能需要转化成某种格式。?由于是匆匆整理,省略了red5 的安装,red5跟tomcat 一样使用起来简单,openmeetings 中的屏幕共享代码我是copy他的做一些修改,但是怎么去用java将他显示?不知道。要是用flex 简直soeasy.明天整理完再写上完整版的,希望本坛神人能help me ! 不然心里有个坎,过不去!!