?? avreceive3.java
字號:
/* * @(#)AVReceive3.java 1.2 01/03/13 * * Copyright (c) 1999-2001 Sun Microsystems, Inc. All Rights Reserved. * * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use, * modify and redistribute this software in source and binary code form, * provided that i) this copyright notice and license appear on all copies of * the software; and ii) Licensee does not utilize the software in a manner * which is disparaging to Sun. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * * This software is not designed or intended for use in on-line control of * aircraft, air traffic, aircraft navigation or aircraft communications; or in * the design, construction, operation or maintenance of any nuclear * facility. Licensee represents and warrants that it will not use or * redistribute the Software for such purposes. */package avtran_rec;import java.io.*;import java.awt.*;import java.net.*;import java.awt.event.*;import java.util.Vector;import javax.media.*;import javax.media.rtp.*;import javax.media.rtp.event.*;import javax.media.rtp.rtcp.*;import javax.media.protocol.*;import javax.media.protocol.DataSource;import javax.media.format.AudioFormat;import javax.media.format.VideoFormat;import javax.media.Format;import javax.media.format.FormatChangeEvent;import javax.media.control.BufferControl;import javax.swing.AbstractButton;import javax.swing.JButton;import javax.swing.JPanel;import javax.swing.JFrame;import javax.swing.ImageIcon;/** * AVReceive3 to receive RTP transmission using the RTPConnector. */public class AVReceive3 implements ReceiveStreamListener, SessionListener, ControllerListener{ String sessions[] = null; RTPManager mgrs[] = null; Vector playerWindows = null; boolean dataReceived = false; Object dataSync = new Object(); JFrame frame; public AVReceive3(String sessions[], JFrame f) { this.sessions = sessions; frame=f; } protected boolean initialize() { try { mgrs = new RTPManager[sessions.length]; playerWindows = new Vector(); SessionLabel session; // Open the RTP sessions. for (int i = 0; i < sessions.length; i++) { // Parse the session addresses. 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); mgrs[i] = (RTPManager) RTPManager.newInstance(); mgrs[i].addSessionListener(this); mgrs[i].addReceiveStreamListener(this); // Initialize the RTPManager with the RTPSocketAdapter mgrs[i].initialize(new RTPSocketAdapter( InetAddress.getByName(session.addr), session.port, session.ttl)); // You can try out some other buffer size to see // if you can get better smoothness. BufferControl bc = (BufferControl)mgrs[i].getControl("javax.media.control.BufferControl"); if (bc != null) bc.setBufferLength(350); } } catch (Exception e){ System.err.println("Cannot create the RTP Session: " + e.getMessage()); return false; } // Wait for data to arrive before moving on. long then = System.currentTimeMillis(); long waitingPeriod = 30000; // wait for a maximum of 30 secs. try{ synchronized (dataSync) { while (!dataReceived && System.currentTimeMillis() - then < waitingPeriod) { if (!dataReceived) System.err.println(" - Waiting for RTP data to arrive..."); dataSync.wait(1000); } } } catch (Exception e) {} if (!dataReceived) { System.err.println("No RTP data was received."); close(); return false; } return true; } public boolean isDone() { return playerWindows.size() == 0; } /** * Close the players and the session managers. */ protected void close() { for (int i = 0; i < playerWindows.size(); i++) { try { // ((PlayerWindow)playerWindows.elementAt(i)).close(); } catch (Exception e) {} } playerWindows.removeAllElements(); // 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; } } } PlayerWindow find(Player p) { for (int i = 0; i < playerWindows.size(); i++) { PlayerWindow pw = (PlayerWindow)playerWindows.elementAt(i); if (pw.player == p) return pw; } return null; } PlayerWindow find(ReceiveStream strm) { for (int i = 0; i < playerWindows.size(); i++) { PlayerWindow pw = (PlayerWindow)playerWindows.elementAt(i); if (pw.stream == strm) return pw; } return null; } /** * SessionListener. */ 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.getCNAME()); } } /** * 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) { try { stream = ((NewReceiveStreamEvent)evt).getReceiveStream(); DataSource ds = stream.getDataSource(); // Find out the formats. RTPControl ctl = (RTPControl)ds.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 Player p = javax.media.Manager.createPlayer(ds); if (p == null) return; p.addControllerListener(this); p.realize(); // added by hang to check time base // p.prefetch(); PlayerWindow pw = new PlayerWindow(p, stream, frame); 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) { 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()); } } else if (evt instanceof ByeEvent) { System.err.println(" - Got \"bye\" from: " + participant.getCNAME()); PlayerWindow pw = find(stream); if (pw != null) { // pw.close(); playerWindows.removeElement(pw); } } } /** * ControllerListener for the Players. */ public synchronized void controllerUpdate(ControllerEvent ce) { Player p = (Player)ce.getSourceController(); if (p == null) return; // Get this when the internal players are realized. if (ce instanceof RealizeCompleteEvent) { PlayerWindow pw = find(p); if (pw == null) { // Some strange happened. System.err.println("Internal error!"); System.exit(-1); } pw.initialize(); frame.setVisible(true); frame.repaint(); if (playerWindows.size()!=0) { try { PlayerWindow pw_temp = (PlayerWindow)playerWindows.elementAt(0); p.setTimeBase(pw_temp.getPlayer().getTimeBase()); } catch (IncompatibleTimeBaseException e) { //error System.out.println("cannot get timebase"); } } p.start(); frame.setVisible(true); frame.repaint(); } if (ce instanceof ControllerErrorEvent) { p.removeControllerListener(this); PlayerWindow pw = find(p); if (pw != null) { //pw.close(); playerWindows.removeElement(pw); } System.err.println("AVReceive3 internal error: " + ce); } } /** * 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); // Now see if there's a addr specified. off = session.indexOf('/'); if (off == -1) { if (!session.equals("")) addr = session; } else { addr = session.substring(0, off); session = session.substring(off + 1); // Now see if there's a port specified off = session.indexOf('/'); if (off == -1) { if (!session.equals("")) portStr = session; } else { portStr = session.substring(0, off); session = session.substring(off + 1); // Now see if there's a ttl specified 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(); } } } } /** * GUI classes for the Player. */ class PlayerWindow { Player player; ReceiveStream stream; JFrame frame; boolean opened=false; // hang to add new panel PlayerWindow(Player p, ReceiveStream strm, JFrame f) { player = p; stream = strm; frame = f; } public void initialize() { frame.add(new PlayerPanel(player)); frame.setVisible(true); frame.repaint(); } public Player getPlayer() { return player; }// public void close() { // player.close(); // setVisible(false); // dispose(); // opened=false; // hang opern //}// public void addNotify() { // frame.addNotify(); // frame.setVisible(true); // frame.pack(); //} } /** * GUI classes for the Player. */ class PlayerPanel extends Panel { Component vc, cc; PlayerPanel(Player p) { setLayout(new FlowLayout()); if ((vc = p.getVisualComponent()) != null) add(vc); if ((cc = p.getControlPanelComponent()) != null) add(cc); } public Dimension getPreferredSize() { int w = 0, h = 0; if (vc != null) { Dimension size = vc.getPreferredSize(); w = size.width; h = size.height; } if (cc != null) { Dimension size = cc.getPreferredSize(); if (w == 0) w = size.width; h += size.height; } if (w < 160) w = 160; return new Dimension(w, h); } } // public static void main(String argv[]) {// if (argv.length == 0)// prUsage();// AVReceive3 avReceive = new AVReceive3(argv, frame);// if (!avReceive.initialize()) {// System.err.println("Failed to initialize the sessions.");// System.exit(-1);// }//// // Check to see if AVReceive3 is done./// try {// while (!avReceive.isDone())// Thread.sleep(1000);// } catch (Exception e) {}// System.err.println("Exiting AVReceive3"); // } static void prUsage() { System.err.println("Usage: AVReceive3 <session> <session> ..."); System.err.println(" <session>: <address>/<port>/<ttl>"); System.exit(0); }}// end of AVReceive3
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -