JMF视频音频通信( 图+源码 )
转自: http://mzhx-com.iteye.com/blog/1098698
最近由于做山寨QQ视频聊天的需要,做了一个视频通信窗口组件。现在分享一下供大家学习……
原创文章,转载请标明出处!谢谢!
工程文件下载地址:http://download.csdn.net/source/3378150
本文地址: http://mzhx-com.iteye.com/blog/1098698
效果图如下:
三个类 源代码如下:
- package vidioPlay;
- import java.awt.Dimension;
- import java.io.IOException;
- import java.net.InetAddress;
- import java.util.Vector;
- import javax.media.CaptureDeviceInfo;
- import javax.media.Codec;
- import javax.media.Control;
- import javax.media.Controller;
- import javax.media.ControllerClosedEvent;
- import javax.media.ControllerEvent;
- import javax.media.ControllerListener;
- import javax.media.Format;
- import javax.media.IncompatibleSourceException;
- import javax.media.Manager;
- import javax.media.MediaLocator;
- import javax.media.NoProcessorException;
- import javax.media.Owned;
- import javax.media.Player;
- import javax.media.Processor;
- import javax.media.cdm.CaptureDeviceManager;
- import javax.media.control.QualityControl;
- import javax.media.control.TrackControl;
- import javax.media.format.AudioFormat;
- import javax.media.format.VideoFormat;
- import javax.media.protocol.ContentDescriptor;
- import javax.media.protocol.DataSource;
- import javax.media.protocol.PushBufferDataSource;
- import javax.media.protocol.PushBufferStream;
- import javax.media.protocol.SourceCloneable;
- import javax.media.rtp.RTPManager;
- import javax.media.rtp.SendStream;
- import javax.media.rtp.SessionAddress;
- import javax.media.rtp.rtcp.SourceDescription;
- import javax.swing.JFrame;
- publicclass MediaTransmit {
- private String ipAddress;
- privateint portBase;
- private MediaLocator audioLocator = null, vedioLocator = null;
- private Processor audioProcessor = null;
- private Processor videoProcessor = null;
- private DataSource audioDataLocal = null, videoDataLocal = null;
- private DataSource audioDataOutput = null, videoDataOutput = null;
- private RTPManager rtpMgrs[];
- private DataSource mediaData = null;
- private DataSource dataLocalClone = null;
- private PlayPane playFrame;
- public MediaTransmit(String ipAddress, String pb) {
- this.ipAddress = ipAddress;
- Integer integer = Integer.valueOf(pb);
- if (integer != null) {
- this.portBase = integer.intValue();
- }
- // /////////////////////////////////////////////
- playFrame = new PlayPane();
- JFrame jf = new JFrame("视频实例");
- jf.add(playFrame);
- jf.pack();
- jf.setLocationRelativeTo(null);
- jf.setDefaultCloseOperation(3);
- jf.setVisible(true);
- // ////////////////////////////////////////////
- Vector<CaptureDeviceInfo> video = CaptureDeviceManager
- .getDeviceList(new VideoFormat(null));
- Vector<CaptureDeviceInfo> audio = CaptureDeviceManager
- .getDeviceList(new AudioFormat(AudioFormat.LINEAR, 44100, 16, 2));
- // MediaLocator mediaLocator = new
- // MediaLocator("file:/C:/纯音乐 - 忧伤还是快乐.mp3");
- if (audio != null && audio.size() > 0) {
- audioLocator = ((CaptureDeviceInfo) audio.get(0)).getLocator();
- if ((audioProcessor = createProcessor(audioLocator)) != null) {
- audioDataLocal = mediaData;
- audioDataOutput = audioProcessor.getDataOutput();
- }
- } else {
- System.out.println("******错误:没有检测到您的音频采集设备!!!");
- }
- // /////////////////////////////////////////////////////////
- if (video != null && video.size() > 0) {
- vedioLocator = ((CaptureDeviceInfo) video.get(0)).getLocator();
- if ((videoProcessor = createProcessor(vedioLocator)) != null) {
- videoDataLocal = mediaData;
- videoDataOutput = videoProcessor.getDataOutput();
- }
- } else {
- System.out.println("******错误:没有检测到您的视频设备!!!");
- }
- // /////////////////////////////////////////////////////////
- final DataSource[] dataSources = new DataSource[2];
- dataSources[0] = audioDataLocal;
- dataSources[1] = videoDataLocal;
- try {
- DataSource dsLocal = Manager.createMergingDataSource(dataSources);
- playFrame.localPlay(dsLocal);
- } catch (IncompatibleSourceException e) {
- e.printStackTrace();
- return;
- }
- // ////////////////////////////////////////////////远程传输
- dataSources[1] = audioDataOutput;
- dataSources[0] = videoDataOutput;
- try {
- DataSource dsoutput = Manager.createMergingDataSource(dataSources);
- createTransmitter(dsoutput);
- } catch (IncompatibleSourceException e) {
- e.printStackTrace();
- return;
- }
- audioProcessor.start();
- videoProcessor.start();
- }
- private Processor createProcessor(MediaLocator locator) {
- Processor processor = null;
- if (locator == null)
- returnnull;
- // 通过设备定位器得到数据源,
- try {
- mediaData = Manager.createDataSource(locator);
- // 创建可克隆数据源
- mediaData = Manager.createCloneableDataSource(mediaData);
- // 克隆数据源,用于传输到远程
- dataLocalClone = ((SourceCloneable) mediaData).createClone();
- } catch (Exception e) {
- e.printStackTrace();
- returnnull;
- }
- try {
- processor = javax.media.Manager.createProcessor(dataLocalClone);
- } catch (NoProcessorException npe) {
- npe.printStackTrace();
- returnnull;
- } catch (IOException ioe) {
- returnnull;
- }
- boolean result = waitForState(processor, Processor.Configured);
- if (result == false)
- returnnull;
- TrackControl[] tracks = processor.getTrackControls();
- if (tracks == null || tracks.length < 1)
- returnnull;
- ContentDescriptor cd = new ContentDescriptor(ContentDescriptor.RAW_RTP);
- processor.setContentDescriptor(cd);
- Format supportedFormats[];
- Format chosen;
- boolean atLeastOneTrack = false;
- for (int i = 0; i < tracks.length; i++) {
- if (tracks[i].isEnabled()) {
- supportedFormats = tracks[i].getSupportedFormats();
- if (supportedFormats.length > 0) {
- if (supportedFormats[0] instanceof VideoFormat) {
- chosen = checkForVideoSizes(tracks[i].getFormat(),
- supportedFormats[0]);
- } else
- chosen = supportedFormats[0];
- tracks[i].setFormat(chosen);
- System.err
- .println("Track " + i + " is set to transmit as:");
- System.err.println(" " + chosen);
- atLeastOneTrack = true;
- } else
- tracks[i].setEnabled(false);
- } else
- tracks[i].setEnabled(false);
- }
- if (!atLeastOneTrack)
- returnnull;
- result = waitForState(processor, Controller.Realized);
- if (result == false)
- returnnull;
- setJPEGQuality(processor, 0.5f);
- return processor;
- }
- private String createTransmitter(DataSource dataOutput) {
- PushBufferDataSource pbds = (PushBufferDataSource) dataOutput;
- PushBufferStream pbss[] = pbds.getStreams();
- System.out.println("pbss.length:" + pbss.length);
- rtpMgrs = new RTPManager[pbss.length];
- SendStream sendStream;
- int port;
- // SourceDescription srcDesList[];
- for (int i = 0; i < pbss.length; i++) {
- try {
- rtpMgrs[i] = RTPManager.newInstance();
- port = portBase + 2 * i;
- SessionAddress localAddr = new SessionAddress(
- InetAddress.getLocalHost(), port);
- SessionAddress destAddr = new SessionAddress(
- InetAddress.getByName(ipAddress), port);
- rtpMgrs[i].initialize(localAddr);
- rtpMgrs[i].addTarget(destAddr);
- System.out.println("Created RTP session: "
- + InetAddress.getLocalHost() + " " + port);
- sendStream = rtpMgrs[i].createSendStream(dataOutput, i);
- sendStream.start();
- } catch (Exception e) {
- e.printStackTrace();
- return e.getMessage();
- }
- }
- returnnull;
- }
- Format checkForVideoSizes(Format original, Format supported) {
- int width, height;
- Dimension size = ((VideoFormat) original).getSize();
- Format jpegFmt = new Format(VideoFormat.JPEG_RTP);
- Format h263Fmt = new Format(VideoFormat.H263_RTP);
- if (supported.matches(jpegFmt)) {
- width = (size.width % 8 == 0 ? size.width
- : (int) (size.width / 8) * 8);
- height = (size.height % 8 == 0 ? size.height
- : (int) (size.height / 8) * 8);
- } elseif (supported.matches(h263Fmt)) {
- if (size.width < 128) {
- width = 128;
- height = 96;
- } elseif (size.width < 176) {
- width = 176;
- height = 144;
- } else {
- width = 352;
- height = 288;
- }
- } else {
- return supported;
- }
- return (new VideoFormat(null, new Dimension(width, height),
- Format.NOT_SPECIFIED, null, Format.NOT_SPECIFIED))
- .intersects(supported);
- }
- void setJPEGQuality(Player p, float val) {
- Control cs[] = p.getControls();
- QualityControl qc = null;
- VideoFormat jpegFmt = new VideoFormat(VideoFormat.JPEG);
- for (int i = 0; i < cs.length; i++) {
- if (cs[i] instanceof QualityControl && cs[i] instanceof Owned) {
- Object owner = ((Owned) cs[i]).getOwner();
- if (owner instanceof Codec) {
- Format fmts[] = ((Codec) owner)
- .getSupportedOutputFormats(null);
- for (int j = 0; j < fmts.length; j++) {
- if (fmts[j].matches(jpegFmt)) {
- qc = (QualityControl) cs[i];
- qc.setQuality(val);
- System.err.println("- Setting quality to " + val
- + " on " + qc);
- break;
- }
- }
- }
- if (qc != null)
- break;
- }
- }
- }
- private Integer stateLock = new Integer(0);
- privateboolean failed = false;
- Integer getStateLock() {
- return stateLock;
- }
- void setFailed() {
- failed = true;
- }
- privatesynchronizedboolean waitForState(Processor p, int state) {
- p.addControllerListener(new StateListener());
- failed = false;
- if (state == Processor.Configured) {
- p.configure();
- } elseif (state == Processor.Realized) {
- p.realize();
- }
- while (p.getState() < state && !failed) {
- synchronized (getStateLock()) {
- try {
- getStateLock().wait();
- } catch (InterruptedException ie) {
- returnfalse;
- }
- }
- }
- if (failed)
- returnfalse;
- else
- returntrue;
- }
- class StateListener implements ControllerListener {
- publicvoid controllerUpdate(ControllerEvent ce) {
- if (ce instanceof ControllerClosedEvent)
- setFailed();
- if (ce instanceof ControllerEvent) {
- synchronized (getStateLock()) {
- getStateLock().notifyAll();
- }
- }
- }
- }
- publicstaticvoid main(String[] args) {
- String[] strs = { "localhost", "9994" };
- new MediaTransmit(strs[0], strs[1]);
- }
- }
package vidioPlay; import java.awt.Dimension; import java.io.IOException; import java.net.InetAddress; import java.util.Vector; import javax.media.CaptureDeviceInfo; import javax.media.Codec; import javax.media.Control; import javax.media.Controller; import javax.media.ControllerClosedEvent; import javax.media.ControllerEvent; import javax.media.ControllerListener; import javax.media.Format; import javax.media.IncompatibleSourceException; import javax.media.Manager; import javax.media.MediaLocator; import javax.media.NoProcessorException; import javax.media.Owned; import javax.media.Player; import javax.media.Processor; import javax.media.cdm.CaptureDeviceManager; import javax.media.control.QualityControl; import javax.media.control.TrackControl; import javax.media.format.AudioFormat; import javax.media.format.VideoFormat; import javax.media.protocol.ContentDescriptor; import javax.media.protocol.DataSource; import javax.media.protocol.PushBufferDataSource; import javax.media.protocol.PushBufferStream; import javax.media.protocol.SourceCloneable; import javax.media.rtp.RTPManager; import javax.media.rtp.SendStream; import javax.media.rtp.SessionAddress; import javax.media.rtp.rtcp.SourceDescription; import javax.swing.JFrame; public class MediaTransmit { private String ipAddress; private int portBase; private MediaLocator audioLocator = null, vedioLocator = null; private Processor audioProcessor = null; private Processor videoProcessor = null; private DataSource audioDataLocal = null, videoDataLocal = null; private DataSource audioDataOutput = null, videoDataOutput = null; private RTPManager rtpMgrs[]; private DataSource mediaData = null; private DataSource dataLocalClone = null; private PlayPane playFrame; public MediaTransmit(String ipAddress, String pb) { this.ipAddress = ipAddress; Integer integer = Integer.valueOf(pb); if (integer != null) { this.portBase = integer.intValue(); } // ///////////////////////////////////////////// playFrame = new PlayPane(); JFrame jf = new JFrame("视频实例"); jf.add(playFrame); jf.pack(); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(3); jf.setVisible(true); // //////////////////////////////////////////// Vector<CaptureDeviceInfo> video = CaptureDeviceManager .getDeviceList(new VideoFormat(null)); Vector<CaptureDeviceInfo> audio = CaptureDeviceManager .getDeviceList(new AudioFormat(AudioFormat.LINEAR, 44100, 16, 2)); // MediaLocator mediaLocator = new // MediaLocator("file:/C:/纯音乐 - 忧伤还是快乐.mp3"); if (audio != null && audio.size() > 0) { audioLocator = ((CaptureDeviceInfo) audio.get(0)).getLocator(); if ((audioProcessor = createProcessor(audioLocator)) != null) { audioDataLocal = mediaData; audioDataOutput = audioProcessor.getDataOutput(); } } else { System.out.println("******错误:没有检测到您的音频采集设备!!!"); } // ///////////////////////////////////////////////////////// if (video != null && video.size() > 0) { vedioLocator = ((CaptureDeviceInfo) video.get(0)).getLocator(); if ((videoProcessor = createProcessor(vedioLocator)) != null) { videoDataLocal = mediaData; videoDataOutput = videoProcessor.getDataOutput(); } } else { System.out.println("******错误:没有检测到您的视频设备!!!"); } // ///////////////////////////////////////////////////////// final DataSource[] dataSources = new DataSource[2]; dataSources[0] = audioDataLocal; dataSources[1] = videoDataLocal; try { DataSource dsLocal = Manager.createMergingDataSource(dataSources); playFrame.localPlay(dsLocal); } catch (IncompatibleSourceException e) { e.printStackTrace(); return; } // ////////////////////////////////////////////////远程传输 dataSources[1] = audioDataOutput; dataSources[0] = videoDataOutput; try { DataSource dsoutput = Manager.createMergingDataSource(dataSources); createTransmitter(dsoutput); } catch (IncompatibleSourceException e) { e.printStackTrace(); return; } audioProcessor.start(); videoProcessor.start(); } private Processor createProcessor(MediaLocator locator) { Processor processor = null; if (locator == null) return null; // 通过设备定位器得到数据源, try { mediaData = Manager.createDataSource(locator); // 创建可克隆数据源 mediaData = Manager.createCloneableDataSource(mediaData); // 克隆数据源,用于传输到远程 dataLocalClone = ((SourceCloneable) mediaData).createClone(); } catch (Exception e) { e.printStackTrace(); return null; } try { processor = javax.media.Manager.createProcessor(dataLocalClone); } catch (NoProcessorException npe) { npe.printStackTrace(); return null; } catch (IOException ioe) { return null; } boolean result = waitForState(processor, Processor.Configured); if (result == false) return null; TrackControl[] tracks = processor.getTrackControls(); if (tracks == null || tracks.length < 1) return null; ContentDescriptor cd = new ContentDescriptor(ContentDescriptor.RAW_RTP); processor.setContentDescriptor(cd); Format supportedFormats[]; Format chosen; boolean atLeastOneTrack = false; for (int i = 0; i < tracks.length; i++) { if (tracks[i].isEnabled()) { supportedFormats = tracks[i].getSupportedFormats(); if (supportedFormats.length > 0) { if (supportedFormats[0] instanceof VideoFormat) { chosen = checkForVideoSizes(tracks[i].getFormat(), supportedFormats[0]); } else chosen = supportedFormats[0]; tracks[i].setFormat(chosen); System.err .println("Track " + i + " is set to transmit as:"); System.err.println(" " + chosen); atLeastOneTrack = true; } else tracks[i].setEnabled(false); } else tracks[i].setEnabled(false); } if (!atLeastOneTrack) return null; result = waitForState(processor, Controller.Realized); if (result == false) return null; setJPEGQuality(processor, 0.5f); return processor; } private String createTransmitter(DataSource dataOutput) { PushBufferDataSource pbds = (PushBufferDataSource) dataOutput; PushBufferStream pbss[] = pbds.getStreams(); System.out.println("pbss.length:" + pbss.length); rtpMgrs = new RTPManager[pbss.length]; SendStream sendStream; int port; // SourceDescription srcDesList[]; for (int i = 0; i < pbss.length; i++) { try { rtpMgrs[i] = RTPManager.newInstance(); port = portBase + 2 * i; SessionAddress localAddr = new SessionAddress( InetAddress.getLocalHost(), port); SessionAddress destAddr = new SessionAddress( InetAddress.getByName(ipAddress), port); rtpMgrs[i].initialize(localAddr); rtpMgrs[i].addTarget(destAddr); System.out.println("Created RTP session: " + InetAddress.getLocalHost() + " " + port); sendStream = rtpMgrs[i].createSendStream(dataOutput, i); sendStream.start(); } catch (Exception e) { e.printStackTrace(); return e.getMessage(); } } return null; } Format checkForVideoSizes(Format original, Format supported) { int width, height; Dimension size = ((VideoFormat) original).getSize(); Format jpegFmt = new Format(VideoFormat.JPEG_RTP); Format h263Fmt = new Format(VideoFormat.H263_RTP); if (supported.matches(jpegFmt)) { width = (size.width % 8 == 0 ? size.width : (int) (size.width / 8) * 8); height = (size.height % 8 == 0 ? size.height : (int) (size.height / 8) * 8); } else if (supported.matches(h263Fmt)) { if (size.width < 128) { width = 128; height = 96; } else if (size.width < 176) { width = 176; height = 144; } else { width = 352; height = 288; } } else { return supported; } return (new VideoFormat(null, new Dimension(width, height), Format.NOT_SPECIFIED, null, Format.NOT_SPECIFIED)) .intersects(supported); } void setJPEGQuality(Player p, float val) { Control cs[] = p.getControls(); QualityControl qc = null; VideoFormat jpegFmt = new VideoFormat(VideoFormat.JPEG); for (int i = 0; i < cs.length; i++) { if (cs[i] instanceof QualityControl && cs[i] instanceof Owned) { Object owner = ((Owned) cs[i]).getOwner(); if (owner instanceof Codec) { Format fmts[] = ((Codec) owner) .getSupportedOutputFormats(null); for (int j = 0; j < fmts.length; j++) { if (fmts[j].matches(jpegFmt)) { qc = (QualityControl) cs[i]; qc.setQuality(val); System.err.println("- Setting quality to " + val + " on " + qc); break; } } } if (qc != null) break; } } } private Integer stateLock = new Integer(0); private boolean failed = false; Integer getStateLock() { return stateLock; } void setFailed() { failed = true; } private synchronized boolean waitForState(Processor p, int state) { p.addControllerListener(new StateListener()); failed = false; if (state == Processor.Configured) { p.configure(); } else if (state == Processor.Realized) { p.realize(); } while (p.getState() < state && !failed) { synchronized (getStateLock()) { try { getStateLock().wait(); } catch (InterruptedException ie) { return false; } } } if (failed) return false; else return true; } class StateListener implements ControllerListener { public void controllerUpdate(ControllerEvent ce) { if (ce instanceof ControllerClosedEvent) setFailed(); if (ce instanceof ControllerEvent) { synchronized (getStateLock()) { getStateLock().notifyAll(); } } } } public static void main(String[] args) { String[] strs = { "localhost", "9994" }; new MediaTransmit(strs[0], strs[1]); } }
- package vidioPlay;
- import java.awt.BorderLayout;
- import java.awt.Component;
- import java.awt.Dimension;
- import java.awt.Panel;
- import java.net.InetAddress;
- import java.util.Vector;
- import javax.media.ControllerErrorEvent;
- import javax.media.ControllerEvent;
- import javax.media.ControllerListener;
- import javax.media.Player;
- import javax.media.RealizeCompleteEvent;
- import javax.media.bean.playerbean.MediaPlayer;
- import javax.media.control.BufferControl;
- import javax.media.format.FormatChangeEvent;
- import javax.media.protocol.DataSource;
- import javax.media.rtp.Participant;
- import javax.media.rtp.RTPControl;
- import javax.media.rtp.RTPManager;
- import javax.media.rtp.ReceiveStream;
- import javax.media.rtp.ReceiveStreamListener;
- import javax.media.rtp.SessionListener;
- import javax.media.rtp.event.ByeEvent;
- import javax.media.rtp.event.NewParticipantEvent;
- import javax.media.rtp.event.NewReceiveStreamEvent;
- import javax.media.rtp.event.ReceiveStreamEvent;
- import javax.media.rtp.event.RemotePayloadChangeEvent;
- import javax.media.rtp.event.SessionEvent;
- import javax.media.rtp.event.StreamMappedEvent;
- import javax.swing.JFrame;
- import net.sf.fmj.media.rtp.RTPSocketAdapter;
- publicclass MediaReceive implements ReceiveStreamListener, SessionListener,
- ControllerListener {
- String sessions[] = null;
- RTPManager mgrs[] = null;
- boolean dataReceived = false;
- Object dataSync = new Object();
- private PlayPane playFrame;
- public MediaReceive(String sessions[]) {
- this.sessions = sessions;
- }
- protectedvoid initialize() {
- playFrame = new PlayPane();
- JFrame jf = new JFrame("视频实例");
- jf.add(playFrame);
- jf.pack();
- jf.setLocationRelativeTo(null);
- jf.setDefaultCloseOperation(3);
- jf.setVisible(true);
- try {
- // 每一个session对应一个RTPManager
- mgrs = new RTPManager[sessions.length];
- // 创建播放窗口的向量vector
- SessionLabel session = null;
- // Open the RTP sessions.
- // 针对每一个会话对象进行ip、port和ttl的解析
- for (int i = 0; i < sessions.length; i++) {
- // Parse the session addresses.
- // 进行会话对象的解析,得到ip、port和ttl
- try {
- session = new SessionLabel(sessions[i]);
- } catch (IllegalArgumentException e) {
- System.err
- .println("Failed to parse the session address given: "
- + sessions[i]);
- // return false;
- }
- System.err.println(" - Open RTP session for: addr: "
- + session.addr + " port: " + session.port + " ttl: "
- + session.ttl);
- // 这对本条会话对象创建RTPManager
- mgrs[i] = (RTPManager) RTPManager.newInstance();
- mgrs[i].addSessionListener(this);
- mgrs[i].addReceiveStreamListener(this);
- // Initialize the RTPManager with the RTPSocketAdapter
- // 将本机ip和端口号加入RTP会话管理
- System.out.println("session.addr:" + session.addr);
- mgrs[i].initialize(new RTPSocketAdapter(InetAddress
- .getByName(session.addr), session.port, session.ttl));
- BufferControl bc = (BufferControl) mgrs[i]
- .getControl("javax.media.control.BufferControl");
- if (bc != null)
- bc.setBufferLength(350);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * Close the players and the session managers.
- */
- protectedvoid close() {
- // close the RTP session.
- for (int i = 0; i < mgrs.length; i++) {
- if (mgrs[i] != null) {
- mgrs[i].removeTargets("Closing session from AVReceive3");
- mgrs[i].dispose();
- mgrs[i] = null;
- }
- }
- }
- /**
- * SessionListener.
- */
- @SuppressWarnings("deprecation")
- publicsynchronizedvoid update(SessionEvent evt) {
- if (evt instanceof NewParticipantEvent) {
- Participant p = ((NewParticipantEvent) evt).getParticipant();
- System.err.println(" - A new participant had just joined: " + p);
- }
- }
- /**
- * ReceiveStreamListener
- */
- publicsynchronizedvoid update(ReceiveStreamEvent evt) {
- RTPManager mgr = (RTPManager) evt.getSource();
- Participant participant = evt.getParticipant(); // could be null.
- ReceiveStream stream = evt.getReceiveStream(); // could be null.
- if (evt instanceof RemotePayloadChangeEvent) {
- System.err.println(" - Received an RTP PayloadChangeEvent.");
- System.err.println("Sorry, cannot handle payload change.");
- // System.exit(0);
- }
- elseif (evt instanceof NewReceiveStreamEvent) {
- System.out.println("evt instanceof NewReceiveStreamEvent");
- try {
- stream = ((NewReceiveStreamEvent) evt).getReceiveStream();
- final DataSource data = stream.getDataSource();
- // Find out the formats.
- RTPControl ctl = (RTPControl) data
- .getControl("javax.media.rtp.RTPControl");
- if (ctl != null) {
- System.err.println(" - Recevied new RTP stream: "
- + ctl.getFormat());
- } else
- System.err.println(" - Recevied new RTP stream");
- if (participant == null)
- System.err
- .println(" The sender of this stream had yet to be identified.");
- else {
- System.err.println(" The stream comes from: "
- + participant.getCNAME());
- }
- // create a player by passing datasource to the Media Manager
- new Thread() {
- publicvoid run() {
- playFrame.remotePlay(data);
- }
- }.start();
- // Player p = javax.media.Manager.createPlayer(data);
- // if (p == null)
- // return;
- //
- // p.addControllerListener(this);
- // p.realize();
- // PlayerWindow pw = new PlayerWindow(p, stream);
- // playerWindows.addElement(pw);
- // Notify intialize() that a new stream had arrived.
- synchronized (dataSync) {
- dataReceived = true;
- dataSync.notifyAll();
- }
- } catch (Exception e) {
- System.err.println("NewReceiveStreamEvent exception "
- + e.getMessage());
- return;
- }
- }
- elseif (evt instanceof StreamMappedEvent) {
- System.out.println("evt instanceof StreamMappedEvent");
- stream = ((StreamMappedEvent) evt).getReceiveStream();
- if (stream != null && stream.getDataSource() != null) {
- DataSource ds = stream.getDataSource();
- // Find out the formats.
- RTPControl ctl = (RTPControl) ds
- .getControl("javax.media.rtp.RTPControl");
- System.err.println(" - The previously unidentified stream ");
- if (ctl != null)
- System.err.println(" " + ctl.getFormat());
- System.err.println(" had now been identified as sent by: "
- + participant.getCNAME());
- System.out.println("ds == null" + (ds == null));
- }
- }
- elseif (evt instanceof ByeEvent) {
- System.err.println(" - Got \"bye\" from: "
- + participant.getCNAME());
- }
- }
- /**
- * ControllerListener for the Players.
- */
- publicsynchronizedvoid controllerUpdate(ControllerEvent ce) {
- Player p = (Player) ce.getSourceController();
- if (p == null)
- return;
- }
- /**
- * A utility class to parse the session addresses.
- */
- class SessionLabel {
- public String addr = null;
- publicint port;
- publicint ttl = 1;
- SessionLabel(String session) throws IllegalArgumentException {
- int off;
- String portStr = null, ttlStr = null;
- if (session != null && session.length() > 0) {
- while (session.length() > 1 && session.charAt(0) == '/') {
- session = session.substring(1);
- }
- off = session.indexOf('/');
- if (off == -1) {
- if (!session.equals(""))
- addr = session;
- } else {
- addr = session.substring(0, off);
- session = session.substring(off + 1);
- off = session.indexOf('/');
- if (off == -1) {
- if (!session.equals(""))
- portStr = session;
- } else {
- portStr = session.substring(0, off);
- session = session.substring(off + 1);
- off = session.indexOf('/');
- if (off == -1) {
- if (!session.equals(""))
- ttlStr = session;
- } else {
- ttlStr = session.substring(0, off);
- }
- }
- }
- }
- if (addr == null)
- thrownew IllegalArgumentException();
- if (portStr != null) {
- try {
- Integer integer = Integer.valueOf(portStr);
- if (integer != null)
- port = integer.intValue();
- } catch (Throwable t) {
- thrownew IllegalArgumentException();
- }
- } else
- thrownew IllegalArgumentException();
- if (ttlStr != null) {
- try {
- Integer integer = Integer.valueOf(ttlStr);
- if (integer != null)
- ttl = integer.intValue();
- } catch (Throwable t) {
- thrownew IllegalArgumentException();
- }
- }
- }
- }
- publicstaticvoid main(String argv[]) {
- String[] strs = { "125.221.165.126/9994", "125.221.165.126/9996" };
- MediaReceive avReceive = new MediaReceive(strs);
- avReceive.initialize();
- }
- }
package vidioPlay; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Panel; import java.net.InetAddress; import java.util.Vector; import javax.media.ControllerErrorEvent; import javax.media.ControllerEvent; import javax.media.ControllerListener; import javax.media.Player; import javax.media.RealizeCompleteEvent; import javax.media.bean.playerbean.MediaPlayer; import javax.media.control.BufferControl; import javax.media.format.FormatChangeEvent; import javax.media.protocol.DataSource; import javax.media.rtp.Participant; import javax.media.rtp.RTPControl; import javax.media.rtp.RTPManager; import javax.media.rtp.ReceiveStream; import javax.media.rtp.ReceiveStreamListener; import javax.media.rtp.SessionListener; import javax.media.rtp.event.ByeEvent; import javax.media.rtp.event.NewParticipantEvent; import javax.media.rtp.event.NewReceiveStreamEvent; import javax.media.rtp.event.ReceiveStreamEvent; import javax.media.rtp.event.RemotePayloadChangeEvent; import javax.media.rtp.event.SessionEvent; import javax.media.rtp.event.StreamMappedEvent; import javax.swing.JFrame; import net.sf.fmj.media.rtp.RTPSocketAdapter; public class MediaReceive implements ReceiveStreamListener, SessionListener, ControllerListener { String sessions[] = null; RTPManager mgrs[] = null; boolean dataReceived = false; Object dataSync = new Object(); private PlayPane playFrame; public MediaReceive(String sessions[]) { this.sessions = sessions; } protected void initialize() { playFrame = new PlayPane(); JFrame jf = new JFrame("视频实例"); jf.add(playFrame); jf.pack(); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(3); jf.setVisible(true); try { // 每一个session对应一个RTPManager mgrs = new RTPManager[sessions.length]; // 创建播放窗口的向量vector SessionLabel session = null; // Open the RTP sessions. // 针对每一个会话对象进行ip、port和ttl的解析 for (int i = 0; i < sessions.length; i++) { // Parse the session addresses. // 进行会话对象的解析,得到ip、port和ttl try { session = new SessionLabel(sessions[i]); } catch (IllegalArgumentException e) { System.err .println("Failed to parse the session address given: " + sessions[i]); // return false; } System.err.println(" - Open RTP session for: addr: " + session.addr + " port: " + session.port + " ttl: " + session.ttl); // 这对本条会话对象创建RTPManager mgrs[i] = (RTPManager) RTPManager.newInstance(); mgrs[i].addSessionListener(this); mgrs[i].addReceiveStreamListener(this); // Initialize the RTPManager with the RTPSocketAdapter // 将本机ip和端口号加入RTP会话管理 System.out.println("session.addr:" + session.addr); mgrs[i].initialize(new RTPSocketAdapter(InetAddress .getByName(session.addr), session.port, session.ttl)); BufferControl bc = (BufferControl) mgrs[i] .getControl("javax.media.control.BufferControl"); if (bc != null) bc.setBufferLength(350); } } catch (Exception e) { e.printStackTrace(); } } /** * Close the players and the session managers. */ protected void close() { // close the RTP session. for (int i = 0; i < mgrs.length; i++) { if (mgrs[i] != null) { mgrs[i].removeTargets("Closing session from AVReceive3"); mgrs[i].dispose(); mgrs[i] = null; } } } /** * SessionListener. */ @SuppressWarnings("deprecation") public synchronized void update(SessionEvent evt) { if (evt instanceof NewParticipantEvent) { Participant p = ((NewParticipantEvent) evt).getParticipant(); System.err.println(" - A new participant had just joined: " + p); } } /** * ReceiveStreamListener */ public synchronized void update(ReceiveStreamEvent evt) { RTPManager mgr = (RTPManager) evt.getSource(); Participant participant = evt.getParticipant(); // could be null. ReceiveStream stream = evt.getReceiveStream(); // could be null. if (evt instanceof RemotePayloadChangeEvent) { System.err.println(" - Received an RTP PayloadChangeEvent."); System.err.println("Sorry, cannot handle payload change."); // System.exit(0); } else if (evt instanceof NewReceiveStreamEvent) { System.out.println("evt instanceof NewReceiveStreamEvent"); try { stream = ((NewReceiveStreamEvent) evt).getReceiveStream(); final DataSource data = stream.getDataSource(); // Find out the formats. RTPControl ctl = (RTPControl) data .getControl("javax.media.rtp.RTPControl"); if (ctl != null) { System.err.println(" - Recevied new RTP stream: " + ctl.getFormat()); } else System.err.println(" - Recevied new RTP stream"); if (participant == null) System.err .println(" The sender of this stream had yet to be identified."); else { System.err.println(" The stream comes from: " + participant.getCNAME()); } // create a player by passing datasource to the Media Manager new Thread() { public void run() { playFrame.remotePlay(data); } }.start(); // Player p = javax.media.Manager.createPlayer(data); // if (p == null) // return; // // p.addControllerListener(this); // p.realize(); // PlayerWindow pw = new PlayerWindow(p, stream); // playerWindows.addElement(pw); // Notify intialize() that a new stream had arrived. synchronized (dataSync) { dataReceived = true; dataSync.notifyAll(); } } catch (Exception e) { System.err.println("NewReceiveStreamEvent exception " + e.getMessage()); return; } } else if (evt instanceof StreamMappedEvent) { System.out.println("evt instanceof StreamMappedEvent"); stream = ((StreamMappedEvent) evt).getReceiveStream(); if (stream != null && stream.getDataSource() != null) { DataSource ds = stream.getDataSource(); // Find out the formats. RTPControl ctl = (RTPControl) ds .getControl("javax.media.rtp.RTPControl"); System.err.println(" - The previously unidentified stream "); if (ctl != null) System.err.println(" " + ctl.getFormat()); System.err.println(" had now been identified as sent by: " + participant.getCNAME()); System.out.println("ds == null" + (ds == null)); } } else if (evt instanceof ByeEvent) { System.err.println(" - Got \"bye\" from: " + participant.getCNAME()); } } /** * ControllerListener for the Players. */ public synchronized void controllerUpdate(ControllerEvent ce) { Player p = (Player) ce.getSourceController(); if (p == null) return; } /** * A utility class to parse the session addresses. */ class SessionLabel { public String addr = null; public int port; public int ttl = 1; SessionLabel(String session) throws IllegalArgumentException { int off; String portStr = null, ttlStr = null; if (session != null && session.length() > 0) { while (session.length() > 1 && session.charAt(0) == '/') { session = session.substring(1); } off = session.indexOf('/'); if (off == -1) { if (!session.equals("")) addr = session; } else { addr = session.substring(0, off); session = session.substring(off + 1); off = session.indexOf('/'); if (off == -1) { if (!session.equals("")) portStr = session; } else { portStr = session.substring(0, off); session = session.substring(off + 1); off = session.indexOf('/'); if (off == -1) { if (!session.equals("")) ttlStr = session; } else { ttlStr = session.substring(0, off); } } } } if (addr == null) throw new IllegalArgumentException(); if (portStr != null) { try { Integer integer = Integer.valueOf(portStr); if (integer != null) port = integer.intValue(); } catch (Throwable t) { throw new IllegalArgumentException(); } } else throw new IllegalArgumentException(); if (ttlStr != null) { try { Integer integer = Integer.valueOf(ttlStr); if (integer != null) ttl = integer.intValue(); } catch (Throwable t) { throw new IllegalArgumentException(); } } } } public static void main(String argv[]) { String[] strs = { "125.221.165.126/9994", "125.221.165.126/9996" }; MediaReceive avReceive = new MediaReceive(strs); avReceive.initialize(); } }
- package vidioPlay;
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.Component;
- import java.awt.Dimension;
- import java.awt.FlowLayout;
- import java.awt.Graphics;
- import java.awt.Rectangle;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.io.IOException;
- import javax.media.ControllerEvent;
- import javax.media.ControllerListener;
- import javax.media.DataSink;
- import javax.media.NoPlayerException;
- import javax.media.Player;
- import javax.media.Processor;
- import javax.media.protocol.DataSource;
- import javax.swing.ImageIcon;
- import javax.swing.JButton;
- import javax.swing.JPanel;
- publicclass PlayPane extends JPanel {
- private ImageIcon videoReqIcon = new ImageIcon("videoReq.jpg");
- private ImageIcon VideolocalIcon = new ImageIcon("localVideo.jpg");
- privateboolean isViewBigPlaying = false;
- privateboolean isViewSmallPlaying = false;
- private JPanel viewBigPane;
- private JPanel viewSmallPane;
- private JPanel controlPane;
- private JButton closeButton;
- privateboolean localPlay = false;
- privateboolean remotePlay = false;
- private DataSource localData;
- private DataSource remoteData;
- privateboolean isViewRun = true;
- privateboolean isShow = true;
- //
- private Player localPlayer = null;
- private Player remotePlayer = null;
- //
- private Processor videotapeProcessor = null;
- private Player videotapePlayer = null;
- private DataSink videotapeFileWriter;
- public PlayPane() {
- this.setLayout(new BorderLayout());
- // 视图面板
- viewBigPane = new JPanel() {
- publicvoid paintComponent(Graphics g) {
- super.paintComponent(g);
- if (!isViewBigPlaying) {
- g.drawImage(videoReqIcon.getImage(), 1, 1,
- videoReqIcon.getIconWidth(),
- videoReqIcon.getIconHeight(), null);
- g.drawRect(getSmallPlayRec().x - 1,
- getSmallPlayRec().y - 1,
- getSmallPlayRec().width + 1,
- getSmallPlayRec().height + 1);
- } else {
- }
- }
- };
- viewBigPane.setBackground(Color.black);
- this.add(viewBigPane, BorderLayout.CENTER);
- viewBigPane.setLayout(null);
- // ///////////////////////////////
- viewSmallPane = new JPanel() {
- publicvoid paintComponent(Graphics g) {
- super.paintComponent(g);
- if (!isViewSmallPlaying) {
- g.drawImage(VideolocalIcon.getImage(), 0, 0, null);
- } else {
- }
- }
- };
- viewSmallPane.setBounds(getSmallPlayRec());
- viewBigPane.add(viewSmallPane);
- viewSmallPane.setLayout(null);
- // 控制面板组件
- closeButton = new JButton("挂断");
- controlPane = new JPanel();
- controlPane.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0));
- controlPane.add(closeButton);
- this.add(controlPane, BorderLayout.SOUTH);
- closeButton.addActionListener(new ActionListener() {
- publicvoid actionPerformed(ActionEvent e) {
- if (localPlayer != null) {
- localPlayer.stop();
- }
- if (remotePlayer != null) {
- remotePlayer.stop();
- }
- if (videotapePlayer != null) {
- videotapePlayer.stop();
- }
- if (videotapeProcessor != null) {
- videotapeProcessor.stop();
- }
- if (videotapeFileWriter != null) {
- try {
- videotapeFileWriter.stop();
- videotapeFileWriter.close();
- } catch (IOException e1) {
- }
- }
- }
- });
- // this.setMinimumSize(new Dimension(videoReqIcon.getIconWidth()+2,
- // 241));
- // this.setPreferredSize(new Dimension(videoReqIcon.getIconWidth()+2,
- // 241));
- }
- public Dimension getMinimumSize() {
- System.out
- .println("controlPane.getHeight():" + controlPane.getHeight());
- returnnew Dimension(videoReqIcon.getIconWidth() + 2,
- videoReqIcon.getIconHeight() + controlPane.getHeight());
- }
- public Dimension getPreferredSize() {
- System.out
- .println("controlPane.getHeight():" + controlPane.getHeight());
- returnnew Dimension(videoReqIcon.getIconWidth() + 2,
- videoReqIcon.getIconHeight()
- + controlPane.getPreferredSize().height);
- }
- publicvoid localPlay(DataSource dataSource) {
- this.setLocalData(dataSource);
- try {
- localPlayer = javax.media.Manager.createPlayer(dataSource);
- localPlayer.addControllerListener(new ControllerListener() {
- publicvoid controllerUpdate(ControllerEvent e) {
- if (e instanceof javax.media.RealizeCompleteEvent) {
- Component comp = null;
- comp = localPlayer.getVisualComponent();
- if (comp != null) {
- // 将可视容器加到窗体上
- comp.setBounds(0, 0, VideolocalIcon.getIconWidth(),
- VideolocalIcon.getIconHeight());
- viewSmallPane.add(comp);
- }
- viewBigPane.validate();
- }
- }
- });
- localPlayer.start();
- localPlay = true;
- } catch (NoPlayerException e1) {
- e1.printStackTrace();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- private Rectangle getSmallPlayRec() {
- int bigShowWidth = videoReqIcon.getIconWidth();
- int bigShowHeight = videoReqIcon.getIconHeight();
- int smallShowWidth = VideolocalIcon.getIconWidth();
- int smallShowHeight = VideolocalIcon.getIconHeight();
- returnnew Rectangle(bigShowWidth - smallShowWidth - 2, bigShowHeight
- - smallShowHeight - 2, smallShowWidth, smallShowHeight);
- }
- publicvoid remotePlay(DataSource dataSource) {
- this.setLocalData(dataSource);
- remotePlay = true;
- try {
- remotePlayer = javax.media.Manager.createPlayer(dataSource);
- remotePlayer.addControllerListener(new ControllerListener() {
- publicvoid controllerUpdate(ControllerEvent e) {
- if (e instanceof javax.media.RealizeCompleteEvent) {
- Component comp;
- if ((comp = remotePlayer.getVisualComponent()) != null) {
- // 将可视容器加到窗体上
- comp.setBounds(1, 1, videoReqIcon.getIconWidth(),
- videoReqIcon.getIconHeight());
- viewBigPane.add(comp);
- }
- viewBigPane.validate();
- }
- }
- });
- remotePlayer.start();
- remotePlay = true;
- } catch (NoPlayerException e1) {
- e1.printStackTrace();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- publicvoid closeViewUI() {
- isShow = false;
- }
- publicboolean isViewRunning() {
- return isViewRun;
- }
- publicboolean isShowing() {
- return isShow;
- }
- publicvoid localReady() {
- localPlay = true;
- }
- publicvoid remoteReady() {
- remotePlay = true;
- }
- publicboolean isRemotePlay() {
- return remotePlay;
- }
- publicvoid setRemotePlay(boolean remotePlay) {
- this.remotePlay = remotePlay;
- }
- public DataSource getRemoteData() {
- return remoteData;
- }
- publicvoid setRemoteData(DataSource remoteData) {
- this.remoteData = remoteData;
- }
- publicboolean isLocalPlay() {
- return localPlay;
- }
- publicvoid setLocalPlay(boolean localPlay) {
- this.localPlay = localPlay;
- }
- public DataSource getLocalData() {
- return localData;
- }
- publicvoid setLocalData(DataSource localData) {
- this.localData = localData;
- }
- }
package vidioPlay; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import javax.media.ControllerEvent; import javax.media.ControllerListener; import javax.media.DataSink; import javax.media.NoPlayerException; import javax.media.Player; import javax.media.Processor; import javax.media.protocol.DataSource; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JPanel; public class PlayPane extends JPanel { private ImageIcon videoReqIcon = new ImageIcon("videoReq.jpg"); private ImageIcon VideolocalIcon = new ImageIcon("localVideo.jpg"); private boolean isViewBigPlaying = false; private boolean isViewSmallPlaying = false; private JPanel viewBigPane; private JPanel viewSmallPane; private JPanel controlPane; private JButton closeButton; private boolean localPlay = false; private boolean remotePlay = false; private DataSource localData; private DataSource remoteData; private boolean isViewRun = true; private boolean isShow = true; // private Player localPlayer = null; private Player remotePlayer = null; // private Processor videotapeProcessor = null; private Player videotapePlayer = null; private DataSink videotapeFileWriter; public PlayPane() { this.setLayout(new BorderLayout()); // 视图面板 viewBigPane = new JPanel() { public void paintComponent(Graphics g) { super.paintComponent(g); if (!isViewBigPlaying) { g.drawImage(videoReqIcon.getImage(), 1, 1, videoReqIcon.getIconWidth(), videoReqIcon.getIconHeight(), null); g.drawRect(getSmallPlayRec().x - 1, getSmallPlayRec().y - 1, getSmallPlayRec().width + 1, getSmallPlayRec().height + 1); } else { } } }; viewBigPane.setBackground(Color.black); this.add(viewBigPane, BorderLayout.CENTER); viewBigPane.setLayout(null); // /////////////////////////////// viewSmallPane = new JPanel() { public void paintComponent(Graphics g) { super.paintComponent(g); if (!isViewSmallPlaying) { g.drawImage(VideolocalIcon.getImage(), 0, 0, null); } else { } } }; viewSmallPane.setBounds(getSmallPlayRec()); viewBigPane.add(viewSmallPane); viewSmallPane.setLayout(null); // 控制面板组件 closeButton = new JButton("挂断"); controlPane = new JPanel(); controlPane.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0)); controlPane.add(closeButton); this.add(controlPane, BorderLayout.SOUTH); closeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (localPlayer != null) { localPlayer.stop(); } if (remotePlayer != null) { remotePlayer.stop(); } if (videotapePlayer != null) { videotapePlayer.stop(); } if (videotapeProcessor != null) { videotapeProcessor.stop(); } if (videotapeFileWriter != null) { try { videotapeFileWriter.stop(); videotapeFileWriter.close(); } catch (IOException e1) { } } } }); // this.setMinimumSize(new Dimension(videoReqIcon.getIconWidth()+2, // 241)); // this.setPreferredSize(new Dimension(videoReqIcon.getIconWidth()+2, // 241)); } public Dimension getMinimumSize() { System.out .println("controlPane.getHeight():" + controlPane.getHeight()); return new Dimension(videoReqIcon.getIconWidth() + 2, videoReqIcon.getIconHeight() + controlPane.getHeight()); } public Dimension getPreferredSize() { System.out .println("controlPane.getHeight():" + controlPane.getHeight()); return new Dimension(videoReqIcon.getIconWidth() + 2, videoReqIcon.getIconHeight() + controlPane.getPreferredSize().height); } public void localPlay(DataSource dataSource) { this.setLocalData(dataSource); try { localPlayer = javax.media.Manager.createPlayer(dataSource); localPlayer.addControllerListener(new ControllerListener() { public void controllerUpdate(ControllerEvent e) { if (e instanceof javax.media.RealizeCompleteEvent) { Component comp = null; comp = localPlayer.getVisualComponent(); if (comp != null) { // 将可视容器加到窗体上 comp.setBounds(0, 0, VideolocalIcon.getIconWidth(), VideolocalIcon.getIconHeight()); viewSmallPane.add(comp); } viewBigPane.validate(); } } }); localPlayer.start(); localPlay = true; } catch (NoPlayerException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } private Rectangle getSmallPlayRec() { int bigShowWidth = videoReqIcon.getIconWidth(); int bigShowHeight = videoReqIcon.getIconHeight(); int smallShowWidth = VideolocalIcon.getIconWidth(); int smallShowHeight = VideolocalIcon.getIconHeight(); return new Rectangle(bigShowWidth - smallShowWidth - 2, bigShowHeight - smallShowHeight - 2, smallShowWidth, smallShowHeight); } public void remotePlay(DataSource dataSource) { this.setLocalData(dataSource); remotePlay = true; try { remotePlayer = javax.media.Manager.createPlayer(dataSource); remotePlayer.addControllerListener(new ControllerListener() { public void controllerUpdate(ControllerEvent e) { if (e instanceof javax.media.RealizeCompleteEvent) { Component comp; if ((comp = remotePlayer.getVisualComponent()) != null) { // 将可视容器加到窗体上 comp.setBounds(1, 1, videoReqIcon.getIconWidth(), videoReqIcon.getIconHeight()); viewBigPane.add(comp); } viewBigPane.validate(); } } }); remotePlayer.start(); remotePlay = true; } catch (NoPlayerException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } public void closeViewUI() { isShow = false; } public boolean isViewRunning() { return isViewRun; } public boolean isShowing() { return isShow; } public void localReady() { localPlay = true; } public void remoteReady() { remotePlay = true; } public boolean isRemotePlay() { return remotePlay; } public void setRemotePlay(boolean remotePlay) { this.remotePlay = remotePlay; } public DataSource getRemoteData() { return remoteData; } public void setRemoteData(DataSource remoteData) { this.remoteData = remoteData; } public boolean isLocalPlay() { return localPlay; } public void setLocalPlay(boolean localPlay) { this.localPlay = localPlay; } public DataSource getLocalData() { return localData; } public void setLocalData(DataSource localData) { this.localData = localData; } }
之后操作如下:
1、安装JMF软件(如果不想安装,就请阅读我转载一篇文章):
2、新建工程将源代码加入工程src下
3、导入第三方包jmf.jar,和fmj.jar(如果网上找不到,请加入该群83945749)
4、运行的时候先运行MediaTransmit类,后运行MediaReceive类
I'm falling off the sky all alone.The courage inside is gonna break the fall. Nothing can dim my light within.
I am That I am
程序 = 数据结构 + 算法