📄 jmstudio.java
字号:
package net.java.mais.media.jmf;
/*
* @(#)JMStudio.java 1.43 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Image;
import java.awt.MenuShortcut;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;
import javax.media.Buffer;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Codec;
import javax.media.Control;
import javax.media.Controller;
import javax.media.Format;
import javax.media.PlugInManager;
import javax.media.PrefetchCompleteEvent;
import javax.media.Processor;
import javax.media.RealizeCompleteEvent;
import javax.media.bean.playerbean.MediaPlayer;
import javax.media.control.FormatControl;
import javax.media.control.FrameGrabbingControl;
import javax.media.control.TrackControl;
import javax.media.format.AudioFormat;
import javax.media.format.FormatChangeEvent;
import javax.media.format.VideoFormat;
import javax.media.protocol.CaptureDevice;
import javax.media.protocol.DataSource;
import javax.media.protocol.PushBufferDataSource;
import javax.media.rtp.RTPStream;
import javax.media.rtp.ReceiveStream;
import javax.media.rtp.ReceiveStreamListener;
import javax.media.rtp.SendStream;
import javax.media.rtp.SessionAddress;
import javax.media.rtp.event.NewReceiveStreamEvent;
import javax.media.rtp.event.ReceiveStreamEvent;
import javax.media.util.BufferToImage;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFileChooser;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import com.sun.media.rtp.RTPSessionMgr;
import com.sun.media.util.JMFI18N;
import jmapps.jmstudio.AboutDialog;
import jmapps.jmstudio.CaptureControlsDialog;
import jmapps.jmstudio.CaptureDialog;
import jmapps.jmstudio.OpenRtpDialog;
import jmapps.jmstudio.OpenUrlDialog;
import jmapps.jmstudio.SaveAsDialog;
import jmapps.jmstudio.TransmitWizard;
import jmapps.rtp.SessionControlDialog;
import jmapps.rtp.TransmissionStatsDialog;
import jmapps.ui.ImageArea;
import jmapps.ui.JMDialog;
import jmapps.ui.MessageDialog;
import jmapps.ui.SnapFrame;
import jmapps.util.CDSWrapper;
import jmapps.util.JMAppsCfg;
public class JMStudio extends PlayerFrame implements ItemListener,
ReceiveStreamListener {
private JMenu menuRecentUrl;
private JMenu menuAE;
private JMenu menuVE;
private JMenuItem menuFileClose;
private JMenuItem menuFileExport;
private JMenuItem menuCapture;
private JCheckBoxMenuItem menuAutoPlay;
private JCheckBoxMenuItem menuAutoLoop;
private JCheckBoxMenuItem menuKeepAspect;
private JMenuItem menuFullScreen;
private JMenuItem menuSnapShot;
private JMenuItem menuPlugins;
private JMenuItem menuCaptureControl;
private JMenuItem menuRtpSessionControl;
private JMenuItem menuTransmissionStats;
private Dimension dimFrameSizeBeforeFullScreen = null;
private Window windowFullScreen = null;
private MouseListener listenerMouseFullScreen;
private Control controlPlugins = null;
private Component componentPlugins = null;
private FrameGrabbingControl controlGrabber = null;
private JFileChooser dlgOpenFile = null;
private JMFRegistry jmfRegistry = null;
private Vector vectorRtpFrames = null;
private SnapFrame frameSnap = null;
private TransmissionStatsDialog dlgTransmissionStats = null;
private SessionControlDialog dlgSessionControl = null;
private String strOptionalTitle = "";
private DataSource dataSourceCurrent = null;
private String nameCaptureDeviceAudio = null;
private String nameCaptureDeviceVideo = null;
private String audioEffect = null;
private String videoEffect = null;
private CaptureControlsDialog dlgCaptureControls = null;
private RTPSessionMgr mngrSessionRtp = null;
private Vector vectorMngrSessions = null;
private Vector vectorStreams = null;
private Vector vectorStreamLabels = null;
boolean killed = false;
boolean recvRTP = false;
public static final String APPNAME = JMFI18N.getResource ( "jmstudio.appname" );
private static final String MENU_FILE = JMFI18N.getResource ( "jmstudio.menu.file" );
private static final String MENU_FILE_NEWWINDOW = JMFI18N.getResource ( "jmstudio.menu.file.newwindow" );
private static final String MENU_FILE_OPENFILE = JMFI18N.getResource ( "jmstudio.menu.file.openfile" );
private static final String MENU_FILE_OPENURL = JMFI18N.getResource ( "jmstudio.menu.file.openurl" );
private static final String MENU_FILE_OPENRTP = JMFI18N.getResource ( "jmstudio.menu.file.openrtp" );
private static final String MENU_FILE_CAPTURE = JMFI18N.getResource ( "jmstudio.menu.file.capture" );
private static final String MENU_FILE_RECENTURL = JMFI18N.getResource ( "jmstudio.menu.file.recent" );
private static final String MENU_FILE_CLOSE = JMFI18N.getResource ( "jmstudio.menu.file.close" );
private static final String MENU_FILE_EXPORT = JMFI18N.getResource ( "jmstudio.menu.file.export" );
private static final String MENU_FILE_TRANSMIT = JMFI18N.getResource ( "jmstudio.menu.file.transmit" );
private static final String MENU_FILE_PREFERENCES = JMFI18N.getResource ( "jmstudio.menu.file.preferences" );
private static final String MENU_FILE_EXIT = JMFI18N.getResource ( "jmstudio.menu.file.exit" );
private static final String MENU_PLAYER = JMFI18N.getResource ( "jmstudio.menu.player" );
private static final String MENU_PLAYER_AUTOPLAY = JMFI18N.getResource ( "jmstudio.menu.player.autoplay" );
private static final String MENU_PLAYER_AUTOLOOP = JMFI18N.getResource ( "jmstudio.menu.player.autoloop" );
private static final String MENU_PLAYER_KEEPASPECT = JMFI18N.getResource ( "jmstudio.menu.player.keepaspect" );
private static final String MENU_PLAYER_FULLSCREEN = JMFI18N.getResource ( "jmstudio.menu.player.fullscreen" );
private static final String MENU_PLAYER_SNAPSHOT = JMFI18N.getResource ( "jmstudio.menu.player.snapshot" );
private static final String MENU_PLAYER_PLUGINS = JMFI18N.getResource ( "jmstudio.menu.player.plugins" );
private static final String MENU_PLAYER_CAPTURE = JMFI18N.getResource ( "jmstudio.menu.player.capturecontrols" );
private static final String MENU_PLAYER_RTPSESSION = JMFI18N.getResource ( "jmstudio.menu.player.rtpsession" );
private static final String MENU_PLAYER_TRANSMISSION = JMFI18N.getResource ( "jmstudio.menu.player.transmission" );
private static final String MENU_HELP = JMFI18N.getResource ( "jmstudio.menu.help");
private static final String MENU_HELP_ABOUT = JMFI18N.getResource ( "jmstudio.menu.help.about");
private static Vector vectorFrames = new Vector (); // keeps count of all open JMStudio frames
private static JMAppsCfg cfgJMApps = null;
private static double dDefaultScale = 1.0;
public JMStudio () {
super ( null, APPNAME );
updateMenu ();
killed = false;
recvRTP = false;
}
public void addNotify () {
super.addNotify ();
}
public void pack () {
super.pack ();
}
protected void initFrame () {
createMenu ();
super.initFrame ();
}
/**
* The metho is created in order to simplify porting SUN's JMStudio from
* awt to Swing.
* @param title String
* @param shortcut MenuShortcut
* @return JMenuItem
*/
private JMenuItem createMenuItem(String title, MenuShortcut shortcut)
{
JMenuItem item = new JMenuItem(title);
item.setAccelerator(KeyStroke.getKeyStroke(shortcut.getKey(),
KeyEvent.CTRL_MASK));
return item;
}
private void createMenu () {
JMenuBar menu;
JMenu menuFile;
JMenu menuPlayer;
JMenu menuHelp;
MenuShortcut shortcut;
JMenuItem itemMenu;
Vector vector;
boolean boolValue;
menu = new JMenuBar ();
this.setJMenuBar ( menu );
// menu File
menuFile = new JMenu ( MENU_FILE );
menu.add ( menuFile );
shortcut = new MenuShortcut ( KeyEvent.VK_N );
itemMenu = createMenuItem( MENU_FILE_NEWWINDOW, shortcut );
itemMenu.addActionListener ( this );
menuFile.add ( itemMenu );
shortcut = new MenuShortcut ( KeyEvent.VK_O );
itemMenu = createMenuItem( MENU_FILE_OPENFILE, shortcut );
itemMenu.addActionListener ( this );
menuFile.add ( itemMenu );
shortcut = new MenuShortcut ( KeyEvent.VK_U );
itemMenu = createMenuItem( MENU_FILE_OPENURL, shortcut );
itemMenu.addActionListener ( this );
menuFile.add ( itemMenu );
shortcut = new MenuShortcut ( KeyEvent.VK_R );
itemMenu = createMenuItem( MENU_FILE_OPENRTP, shortcut );
itemMenu.addActionListener ( this );
menuFile.add ( itemMenu );
shortcut = new MenuShortcut ( KeyEvent.VK_P );
menuCapture = createMenuItem( MENU_FILE_CAPTURE, shortcut );
menuCapture.addActionListener ( this );
menuFile.add ( menuCapture );
vector = CaptureDeviceManager.getDeviceList ( null );
if ( vector == null || vector.size() < 1 )
menuCapture.setEnabled ( false );
else
menuCapture.setEnabled ( true );
menuRecentUrl = new JMenu ( MENU_FILE_RECENTURL );
updateRecentUrlMenu ();
menuFile.add ( menuRecentUrl );
shortcut = new MenuShortcut ( KeyEvent.VK_W );
menuFileClose = createMenuItem( MENU_FILE_CLOSE, shortcut );
menuFileClose.addActionListener ( this );
menuFile.add ( menuFileClose );
menuFile.addSeparator ();
shortcut = new MenuShortcut ( KeyEvent.VK_E );
menuFileExport = createMenuItem( MENU_FILE_EXPORT, shortcut );
menuFileExport.addActionListener ( this );
menuFile.add ( menuFileExport );
shortcut = new MenuShortcut ( KeyEvent.VK_T );
itemMenu = createMenuItem( MENU_FILE_TRANSMIT, shortcut );
itemMenu.addActionListener ( this );
menuFile.add ( itemMenu );
menuFile.addSeparator ();
itemMenu = new JMenuItem ( MENU_FILE_PREFERENCES );
itemMenu.addActionListener ( this );
menuFile.add ( itemMenu );
shortcut = new MenuShortcut ( KeyEvent.VK_X );
itemMenu = createMenuItem( MENU_FILE_EXIT, shortcut );
itemMenu.addActionListener ( this );
menuFile.add ( itemMenu );
// menu Player
menuPlayer = new JMenu ( MENU_PLAYER );
menu.add ( menuPlayer );
// It's a funny thing that we have to make this kind of a call at all,
// less in this particular place. But if we don't do that here,
// Windows will screw up the frame insets and therefore the layout.
this.addNotify ();
if ( cfgJMApps != null )
boolValue = cfgJMApps.getAutoPlay ();
else
boolValue = false;
menuAutoPlay = new JCheckBoxMenuItem( MENU_PLAYER_AUTOPLAY, boolValue );
menuAutoPlay.addItemListener ( this );
menuPlayer.add ( menuAutoPlay );
if ( cfgJMApps != null )
boolValue = cfgJMApps.getAutoLoop ();
else
boolValue = true;
menuAutoLoop = new JCheckBoxMenuItem( MENU_PLAYER_AUTOLOOP, boolValue );
menuAutoLoop.addItemListener ( this );
menuPlayer.add ( menuAutoLoop );
if ( cfgJMApps != null )
boolValue = cfgJMApps.getKeepAspectRatio ();
else
boolValue = false;
menuKeepAspect = new JCheckBoxMenuItem( MENU_PLAYER_KEEPASPECT, boolValue );
menuKeepAspect.addItemListener ( this );
menuPlayer.add ( menuKeepAspect );
menuPlayer.addSeparator ();
shortcut = new MenuShortcut ( KeyEvent.VK_F );
menuFullScreen = createMenuItem( MENU_PLAYER_FULLSCREEN, shortcut );
menuFullScreen.addActionListener ( this );
menuPlayer.add ( menuFullScreen );
shortcut = new MenuShortcut ( KeyEvent.VK_S );
menuSnapShot = createMenuItem(MENU_PLAYER_SNAPSHOT, shortcut );
menuSnapShot.addActionListener ( this );
menuPlayer.add ( menuSnapShot );
menuPlayer.addSeparator ();
// shortcut = new MenuShortcut ( KeyEvent.VK_V );
menuPlugins = new JMenuItem ( MENU_PLAYER_PLUGINS /*, shortcut*/ );
menuPlugins.addActionListener ( this );
menuPlayer.add ( menuPlugins );
// shortcut = new MenuShortcut ( KeyEvent.VK_A );
menuCaptureControl = new JMenuItem ( MENU_PLAYER_CAPTURE /*, shortcut*/ );
menuCaptureControl.addActionListener ( this );
menuPlayer.add ( menuCaptureControl );
// shortcut = new MenuShortcut ( KeyEvent.VK_I );
menuRtpSessionControl = new JMenuItem ( MENU_PLAYER_RTPSESSION /*, shortcut*/ );
menuRtpSessionControl.addActionListener ( this );
menuPlayer.add ( menuRtpSessionControl );
// shortcut = new MenuShortcut ( KeyEvent.VK_M );
menuTransmissionStats = new JMenuItem ( MENU_PLAYER_TRANSMISSION /*, shortcut*/ );
menuTransmissionStats.addActionListener ( this );
menuPlayer.add ( menuTransmissionStats );
// Add effects menus
menuPlayer.addSeparator();
Vector videoEffects = getEffectList(new VideoFormat(null));
Vector audioEffects = getEffectList(new AudioFormat(null));
if (videoEffects.size() > 0) {
menuVE = new JMenu("Insert Video Effect");
fillEffectList(menuVE, videoEffects);
menuPlayer.add(menuVE);
}
if (audioEffects.size() > 0) {
menuAE = new JMenu("Insert Audio Effect");
fillEffectList(menuAE, audioEffects);
menuPlayer.add(menuAE);
}
// menu Help
menuHelp = new JMenu ( MENU_HELP );
menu.add ( menuHelp );
shortcut = new MenuShortcut ( KeyEvent.VK_H );
itemMenu = createMenuItem ( MENU_HELP_ABOUT, shortcut );
itemMenu.addActionListener ( this );
menuHelp.add ( itemMenu );
}
public void actionPerformed ( ActionEvent event ) {
String strCmd;
Object objSource;
String nameUrl;
Frame frame;
Component component;
strCmd = event.getActionCommand ();
objSource = event.getSource ();
if ( strCmd == null && objSource instanceof JMenuItem )
strCmd = ((JMenuItem)objSource).getActionCommand ();
if ( strCmd == null )
return;
if ( strCmd.equals(MENU_FILE_NEWWINDOW) ) {
createNewFrame ();
}
else if ( strCmd.equals(MENU_FILE_OPENFILE) ) {
openFile ();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -