天天看點

JMF示例(二)

import javax.media.*;

import com.sun.media.ui.*;

import javax.media.protocol.*;

import javax.media.protocol.DataSource;

import javax.swing.*;

import javax.swing.event.*;

import java.awt.*;

import java.awt.event.*;

import java.net.*;

import java.io.*;

import java.util.Vector;

public class MDIApp extends Frame 

{

    /*************************************************************************

     * MAIN PROGRAM / STATIC METHODS

     *************************************************************************/  

    public static void main(String args[]) 

    {

        MDIApp mdi = new MDIApp();

    }

    static void Fatal(String s) 

        MessageBox mb = new MessageBox("JMF Error", s);       

    }    

     * VARIABLES

     *************************************************************************/

    JMFrame jmframe = null;

    JDesktopPane desktop;

    FileDialog fd = null;

    CheckboxMenuItem cbAutoLoop = null;

    Player player = null;

    Player newPlayer = null;

    String filename;

     * METHODS

    public MDIApp()

        super("Java Media Player");

        // Add the desktop pane

        setLayout( new BorderLayout() );

        desktop = new JDesktopPane();

        desktop.setDoubleBuffered(true);//設定雙緩存

        add("Center", desktop);

        setMenuBar(createMenuBar());

        setSize(640, 480);

        setVisible(true);        

        try 

        {

            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

        } 

        catch (Exception e) 

            System.err.println("Could not initialize java.awt Metal lnf");

        }

        addWindowListener( new WindowAdapter() {

            public void windowClosing(WindowEvent we) {

            System.exit(0);

            }

        } );    

        Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, new Boolean(true));

    private MenuBar createMenuBar() 

        ActionListener al = new ActionListener()

            public void actionPerformed(ActionEvent ae)

            {

                String command = ae.getActionCommand();

                if (command.equals("Open"))

                {

                    if (fd == null) 

                    {

                        fd = new FileDialog(MDIApp.this, "Open File",

                                           FileDialog.LOAD);

                        fd.setDirectory("/movies");

                    }

                    fd.show();

                    if (fd.getFile() != null) 

                        String filename = fd.getDirectory() + fd.getFile();

                        openFile("file:" + filename);

                }

                else if (command.equals("Exit")) 

                    dispose();

                    System.exit(0);

        };

        MenuItem item;

        MenuBar mb = new MenuBar();

        // File Menu

        Menu mnFile = new Menu("File");

        mnFile.add(item = new MenuItem("Open"));

        item.addActionListener(al);

        mnFile.add(item = new MenuItem("Exit"));

        // Options Menu    

        Menu mnOptions = new Menu("Options");

        cbAutoLoop = new CheckboxMenuItem("Auto replay");

        cbAutoLoop.setState(true);

        mnOptions.add(cbAutoLoop);

        mb.add(mnFile);

        mb.add(mnOptions);

        return mb;

    }            

    /**

     * Open a media file.

     */

    public void openFile(String filename) 

        String mediaFile = filename;

        Player player = null;

        // URL for our media file

        URL url = null;

        try

            // Create an url from the file name and the url to the

            // document containing this applet.

            if ((url = new URL(mediaFile)) == null)

                Fatal("Can't build URL for " + mediaFile);

                return;

            // Create an instance of a player for this media

            try 

                player = Manager.createPlayer(url);//建立播放器

            catch (NoPlayerException e) 

                Fatal("Error: " + e);

        catch (MalformedURLException e) 

            Fatal("Error:" + e);

        catch (IOException e) 

        if (player != null) 

            this.filename = filename;//儲存檔案名稱

            JMFrame jmframe = new JMFrame(player, filename);//建立立一個播放視窗

            desktop.add(jmframe);

}

class JMFrame extends JInternalFrame implements ControllerListener

{//播放器

    Player mplayer;

    Component visual = null;

    Component control = null;

    int videoWidth = 0;

    int videoHeight = 0;

    int controlHeight = 30;

    int insetWidth = 10;

    int insetHeight = 30;

    boolean firstTime = true;

    public JMFrame(Player player, String title) 

        super(title, true, true, true, true);

        getContentPane().setLayout( new BorderLayout() );

        setSize(320, 10);

        setLocation(50, 50);

        setVisible(true);

        mplayer = player;

        mplayer.addControllerListener((ControllerListener) this);

        mplayer.realize();

        addInternalFrameListener( new InternalFrameAdapter() 

                public void internalFrameClosing(InternalFrameEvent ife)

                    mplayer.close();

            } 

        );    

    public void controllerUpdate(ControllerEvent ce) 

        if (ce instanceof RealizeCompleteEvent) 

            mplayer.prefetch();

        else if (ce instanceof PrefetchCompleteEvent)

            if (visual != null)

            return;

            if ((visual = mplayer.getVisualComponent()) != null) 

                Dimension size = visual.getPreferredSize();

                videoWidth = size.width;

                videoHeight = size.height;

                getContentPane().add("Center", visual);

            else

                videoWidth = 320;

            if ((control = mplayer.getControlPanelComponent()) != null)

                controlHeight = control.getPreferredSize().height;

                getContentPane().add("South", control);

            setSize(videoWidth + insetWidth,videoHeight + controlHeight + insetHeight);

            validate();

            mplayer.start();

        else if (ce instanceof EndOfMediaEvent)

            mplayer.setMediaTime(new Time(0));

問題:如何結合Swing元件使用JMF。Swing元件是輕量級元件,而JMF預設使用的是重量級元件(它們可以為高速率的視訊使用本地的繪制方法)。

解決方案:

      JMF2.0包含了幾個不同的視訊繪制器,可以強制讓播放器使用輕量級元件。示例如下:

      Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, new Boolean(true));

這在内部是通過PlugInManager來使其隻能使用輕量級繪制器,此後建立的任何播放器都将使用輕量級繪制器。注意的是存在父容器中的元件的雙緩存功能應該要開啟。

本文轉自Phinecos(洞庭散人)部落格園部落格,原文連結:http://www.cnblogs.com/phinecos/archive/2007/09/22/902864.html,如需轉載請自行聯系原作者