Hallo!
Ich habe eine Klasse, die per JMF einen Effekt über einen Videostrom legt. Das ganze funktioniert einwandfrei, wird auch in einem externen Player geöffnet. Ich will das ganze jetzt aber in ein Swing-Interface einbauen, hab da aber noch wenig Erfahrung und die Tutorials haben mir zwar ein bisschen weitergeholfen, aber nicht so ganz zum Ziel geführt.
Hier mein Code:
Jetzt weiß ich im Swing-Bereich nicht weiter, es wird weder ein Filechooser noch ein panel angezeigt. Außerdem öffnet sich das Swing-Fenster neben dem Player-Fenster... Kann mir da vielleicht jemand weiterhelfen?
Danke
Ich habe eine Klasse, die per JMF einen Effekt über einen Videostrom legt. Das ganze funktioniert einwandfrei, wird auch in einem externen Player geöffnet. Ich will das ganze jetzt aber in ein Swing-Interface einbauen, hab da aber noch wenig Erfahrung und die Tutorials haben mir zwar ein bisschen weitergeholfen, aber nicht so ganz zum Ziel geführt.
Hier mein Code:
Code:
/*
*
* Hier wird der Player als eine Processorinstanz des JMF erzeugt
* und das eine vom User definierte Videodatei abgespielt. Beim
* erzeugen des Processor wird als Codec der Schneefallfilter aus
* der Datei SnowEffect.java hinzugefügt, der dann über das Video
* gelegt wird.
*
*/
import javax.swing.*;
import javax.swing.SwingUtilities;
import java.awt.*;
import java.awt.event.*;
import java.net.MalformedURLException;
import java.net.URL;
import javax.media.*;
import javax.media.control.TrackControl;
import javax.media.Format;
import javax.media.format.*;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class SnowPlayer extends Frame implements ControllerListener
{
Processor p;
Object waitSync = new Object();
boolean stateTransitionOK = true;
public SnowPlayer()
{
super("PugIn: SnowEffect");
}
/**
* Given a media locator, create a processor and use that processor
* as a player to playback the media. During the processor's
* Configured state, the Snow Effect is inserted into the video track.
**/
public boolean open(MediaLocator ml)
{
try
{
p = Manager.createProcessor(ml);
}
catch (Exception e)
{
System.err.println("Failed to create a processor from the given url: " + e);
return false;
}
p.addControllerListener(this);
// Put the Processor into configured state
p.configure();
if (!waitForState(p.Configured))
{
System.err.println("Failed to configure the processor.");
return false;
}
// So I can use it as a player
p.setContentDescriptor(null);
// Obtain the track controls
TrackControl tc[] = p.getTrackControls();
if (tc == null)
{
System.err.println("Failed to obtain track controls from the processor.");
return false;
}
// Search for the track control for the video track
TrackControl videoTrack = null;
for (int i = 0; i < tc.length; i++)
{
if (tc[i].getFormat() instanceof VideoFormat)
{
videoTrack = tc[i];
break;
}
}
if (videoTrack == null)
{
System.err.println("The input media does not contain a video track.");
return false;
}
System.err.println("Video format: " + videoTrack.getFormat());
// Instantiate and set the frame access codec to the data flow path
try
{
Codec codec[] = { new SnowEffect() };
videoTrack.setCodecChain(codec);
}
catch (UnsupportedPlugInException e)
{
System.err.println("The processor does not support effects.");
}
// Realize the processor
p.prefetch();
if (!waitForState(p.Prefetched))
{
System.err.println("Failed to realize the processor.");
return false;
}
// Display the visual & control component if there's one
setLayout(new BorderLayout());
Component cc;
Component vc;
if ((vc = p.getVisualComponent()) != null)
{
add("Center", vc);
}
if ((cc = p.getControlPanelComponent()) != null)
{
add("South", cc);
}
// Start the processor.
p.start();
setVisible(true);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
p.close();
System.exit(0);
}
});
return true;
}
public void addNotify()
{
super.addNotify();
pack();
}
/**
* Block until the processor has transitioned to the given state.
* Return false if the transition failed.
*/
boolean waitForState(int state)
{
synchronized (waitSync)
{
try
{
while (p.getState() != state && stateTransitionOK)
waitSync.wait();
}
catch (Exception e)
{}
}
return stateTransitionOK;
}
/**
* Controller Listener.
*/
public void controllerUpdate(ControllerEvent evt)
{
if (evt instanceof ConfigureCompleteEvent ||
evt instanceof RealizeCompleteEvent ||
evt instanceof PrefetchCompleteEvent)
{
synchronized (waitSync)
{
stateTransitionOK = true;
waitSync.notifyAll();
}
}
else if (evt instanceof ResourceUnavailableEvent)
{
synchronized (waitSync)
{
stateTransitionOK = false;
waitSync.notifyAll();
}
}
else if (evt instanceof EndOfMediaEvent)
{
p.close();
System.exit(0);
}
}
// Swing
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
//Erstellt das Fenster
JFrame frame = new JFrame("Schneefall");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Beschriftung des Fensters
JLabel label = new JLabel("Schneefall");
frame.getContentPane().add(label);
//Zeigt das Fenster an
frame.pack();
frame.setVisible(true);
//Filechooser
final JFileChooser fc = new JFileChooser();
int returnVal = fc.showOpenDialog(aComponent);
//Panels:
JPanel bright = new JPanel(new BorderLayout());
JPanel intens = new JPanel(new BorderLayout());
}
/**
* Main program
*/
public static void main(String [] args)
{
URL mediaURL = null;
MediaLocator ml;
// Create a file chooser
JFileChooser fileChooser = new JFileChooser("d:/studium/java/schnee_class");
// Show open file dialog
int result = fileChooser.showOpenDialog( null );
// User chose a file
if ( result == JFileChooser.APPROVE_OPTION )
{
try
{
// Get the file as URL
mediaURL = fileChooser.getSelectedFile().toURL();
}
catch ( MalformedURLException malformedURLException )
{
System.err.println( "Could not create URL for the file" );
}
// Only display if there is a valid URL
if ( mediaURL == null )
{
System.exit(0);
}
System.err.println("url = " + mediaURL);
}
// Try to build a media locator
if ((ml = new MediaLocator(mediaURL)) == null)
{
System.err.println("Cannot build media locator from: " + mediaURL);
System.exit(0);
}
// Finally try to play the video
SnowPlayer fa = new SnowPlayer();
if (!fa.open(ml))
{
System.exit(0);
}
//Swing
Runnable runnable = new Runnable() {
public void run() {
createAndShowGUI();
}
};
SwingUtilities.invokeLater(runnable);
}
}
Jetzt weiß ich im Swing-Bereich nicht weiter, es wird weder ein Filechooser noch ein panel angezeigt. Außerdem öffnet sich das Swing-Fenster neben dem Player-Fenster... Kann mir da vielleicht jemand weiterhelfen?
Danke