📄 controllervideopanel.java
字号:
/* ControllerVideoPanel.java
*
* Panel displaying video that can be played from file or from RTP
* transmission. Used by VideoViewer.
*
* Copyright (C) 2002 by Frank McCown
* University of Arkansas at Little Rock
* July 2002
*/
import javax.media.rtp.*;
import javax.media.rtp.event.*;
import javax.media.*;
import javax.media.protocol.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;
class ControllerVideoPanel extends JPanel implements ControllerListener, ReceiveStreamListener
{
private Player mplayer;
private Component visual = null;
private Component control = null;
private RTPManager manager = null; // Used to manage RTP session from MediaServer
private boolean dataReceived = false;
private Object dataSync = new Object();
public ControllerVideoPanel()
{
setLayout(new BorderLayout());
}
private void createPlayer(String filename)
{
try
{
String rtpURL = filename; //"rtp://" + ipAddress + ":" + port + "/video";
System.out.println("Video to play: " +rtpURL);
mplayer = Manager.createPlayer(new MediaLocator(rtpURL));
mplayer.addControllerListener((ControllerListener) this);
mplayer.realize();
}
catch (NoPlayerException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
private void removePreviousManager()
{
if (manager != null)
{
System.out.println("Disposing RTPManager.");
manager.dispose();
manager = null;
}
}
public void play(String filename)
{
removePreviousPlayer();
removePreviousManager();
createPlayer(filename);
mplayer.start();
}
public void playRTP(String url)
{
System.out.println("About to play: " +url);
// Get port from url
int colon = url.indexOf(':', 4); // Skip rtp:
int endColon = url.indexOf('/', colon);
String portString = url.substring(colon+1, endColon);
int port = Integer.parseInt(portString);
removePreviousPlayer();
removePreviousManager();
manager = (RTPManager) RTPManager.newInstance();
manager.addReceiveStreamListener(this);
try
{
SessionAddress localAddr = new SessionAddress(java.net.InetAddress.getLocalHost(), port);
SessionAddress destAddr = new SessionAddress(java.net.InetAddress.getLocalHost(), port);
// Must have both of these set before receiving a transmission
manager.initialize(localAddr);
manager.addTarget(destAddr);
/* // Wait for data to arrive before moving on.
long then = System.currentTimeMillis();
long waitingPeriod = 15000; // wait for a maximum of 15 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)
{
e.printStackTrace();
}
if (!dataReceived)
{
System.err.println("No RTP data was received.");
//close();
//return false;
}
//return true;*/
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void stop()
{
if (mplayer != null)
mplayer.stop();
}
private void removePreviousPlayer()
{
if (mplayer == null)
{
// System.out.println("mplayer is NULL");
return;
}
try
{
Component visual = mplayer.getVisualComponent();
Component control = mplayer.getControlPanelComponent();
if (visual != null)
this.remove(visual);
if (control != null)
this.remove(control );
mplayer.close();
}
catch (NotRealizedError e)
{
System.out.println("Media player wasn't previously realized." +
" Probably because invalid file opened before.");
}
}
public void controllerUpdate(ControllerEvent ce)
{
if (ce instanceof RealizeCompleteEvent)
{
//System.out.println("RealizeCompleteEvent");
if ((visual = mplayer.getVisualComponent()) != null)
add(visual, BorderLayout.CENTER);
if ((control = mplayer.getControlPanelComponent()) != null)
add(control, BorderLayout.SOUTH);
// JUST UNCOMMENTED FOLLOWING LINE TO TEST RTP RECEPTION
mplayer.start();
// Force screen to update itself. Must be called explicitly because for some
// reason the player is not getting automatically validated.
this.revalidate();
}
else if (ce instanceof EndOfMediaEvent)
{
// Reset back to beginning if playing a local video file
mplayer.setMediaTime(new javax.media.Time(0));
}
else if (ce instanceof StartEvent) // Media is starting
{
// System.out.println("StartEvent");
// Turn off waiting sign
VideoViewer.lblInfo.setText("");
}
}
/**
* 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.");
}
else if (evt instanceof NewReceiveStreamEvent)
{
System.out.println("NewReceiveStreamEvent recieved.");
// We're being notified that a new RTP stream is available, so create and realize
// player and notify loop that data was received
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
mplayer = Manager.createPlayer(ds);
if (mplayer == null)
{
System.err.println("Error creating media player.");
return;
}
mplayer.addControllerListener(this);
mplayer.realize();
// Notify loop 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.err.println("StreamMappedEvent event");
/* 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());
// Stop the player but don't close it because it will be reused.
mplayer.stop();
removePreviousManager();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -