JMF示例(一)

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.lang.String;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
import javax.media.*;

import com.sun.media.*;

/**
  * This is a Java Applet that demonstrates how to create a simple
  * media player with a media event listener. It will play the
  * media clip right away and continuously loop.
  * 
  * <!-- Sample HTML
  * <applet code=TVApplet width=587 height=510>
  * <param name=file value="sun.avi">
  * </applet>
  * -->
  */
public class TVApplet extends Applet implements ControllerListener 
{
    private String fileToPlay = "";//要播放的文件(完整的路径名称)
    // media Player
    Player player = null;//播放器
    // component in which video is playing
    Component visualComponent = null;//可视组件
    // controls gain, position, start, stop
    Component controlComponent = null;//控制组件
    // displays progress during download
    Component progressBar = null;//进度条
long CachingSize = 0L;  
    Panel panel = null;
    Panel vPanel = null;
    int controlPanelHeight = 0;
    Image [] showmeImage = null;
    Image [] zoomImageUp = null;
    Image [] zoomImageDn = null;
    CPanel cPanel = null;
    ZoomButton zoomButton;
    
    final int [] VLEFT = {59, 120};
    final int [] VTOP  = {33, 67};
    final int [] VRIGHT = {59 + 175, 120 + 351};
    final int [] VBOTTOM = {173, 67 + 287 + 11};
    final int [] WIDTH = {176, 352};
    final int [] HEIGHT = {138, 288};

    final int HALF = 0;//小屏
    final int FULL = 1;//全屏

    int tSize = 0;
    
    /**
     * Read the applet file parameter and create the media 
     * player.
     */
    public void init() 
    {

    setLayout(null);
    setBackground(Color.white);
    
    cPanel = new CPanel( );
    add(cPanel);

    // Figure out what size to use
    // The applet tag takes an optional parameter "SIZE" whose value
    // can be "half" or "full"
    // Eg. <param name=size value=half>
    
    String szSize = "full" ;//getParameter("SIZE");
    //屏幕一般是1024*768
    if (Toolkit.getDefaultToolkit().getScreenSize().getWidth() > 800)
        tSize = 1;
    else
        tSize = 0;
    
    if (szSize != null)
    {
        if (szSize.toLowerCase().equals("full"))
            tSize = 1;
        else if (szSize.toLowerCase().equals("half"))
            tSize = 0;
    }

    cPanel.setBounds(VLEFT[tSize], VTOP[tSize], WIDTH[tSize], HEIGHT[tSize]);//设置播放器上部分的窗口矩阵的位置

    // Get the images
    showmeImage = new Image[FULL + 1];
    zoomImageUp = new Image[FULL + 1];
    zoomImageDn = new Image[FULL + 1];
    
    showmeImage[HALF] = getImage(getDocumentBase(), "ShowMeS2.jpg");
    showmeImage[FULL] = getImage(getDocumentBase(), "ShowMeS.jpg");
    zoomImageUp[HALF] = getImage(getDocumentBase(), "InUp.gif");
    zoomImageDn[HALF] = getImage(getDocumentBase(), "InDn.gif");
    zoomImageUp[FULL] = getImage(getDocumentBase(), "OutUp.gif");
    zoomImageDn[FULL] = getImage(getDocumentBase(), "OutDn.gif");
    addZoomButton();

    // URL for our media file
    URL url = null;

    this.fileToPlay = "d://rr.mp3";
    File fileToPlay = new File(this.fileToPlay);
    try 
    {
        // Create an url from the file name and the url to the
        // document containing this applet.
        if ((url = fileToPlay.toURL()) == null)
        Fatal("Can't build URL for " + this.fileToPlay);
        // Create an instance of a player for this media
        try 
        {
            player = Manager.createPlayer(url);//创建播放器
        } 
        catch (NoPlayerException e) 
        {
        System.out.println(e);
        Fatal("Could not create player for " + url);
        }
        // Add ourselves as a listener for a player's events
        player.addControllerListener(this);//为播放器事件增加监听者 

    }
    catch (MalformedURLException e) 
    {
        Fatal("Invalid media file URL!");
    }
    catch (IOException e) 
    {
        Fatal("IO exception creating player for " + url);
    }
}

    /**
     * Start media file playback. This function is called the
     * first time that the Applet runs and every
     * time the user re-enters the page.
     */

    public void start() 
    {
        if (player != null)
            player.realize();
    }

    /**
     * Stop media file playback and release resource before
     * leaving the page.
     */
    public void stop() 
    {
        if (player != null)
        {
            player.stop();
            player.deallocate();
        }
    }

    public void destroy() 
    {
        player.close();
    }

    public void paint(Graphics g) 
    {
    if (showmeImage[tSize] != null)
        g.drawImage(showmeImage[tSize], 0, 0, this);
    super.paint(g);
    }

    public synchronized void reSize() 
    {
    cPanel.setBounds(VLEFT[tSize], VTOP[tSize], WIDTH[tSize], HEIGHT[tSize]);
    if (visualComponent != null) {
        Dimension size = visualComponent.getPreferredSize();
        int width = size.width;
        int height = size.height;

        while (true) {
        // Scale to fit
        if (width > WIDTH[tSize] || height > HEIGHT[tSize]) {
            width /= 2;
            height /= 2;
        } else if (width < WIDTH[tSize] && height < HEIGHT[tSize]) {
            if (width * 2 <= WIDTH[tSize] && height*2 <= HEIGHT[tSize]) {
            width *= 2;
            height *= 2;
            } else
            break;
        } else
            break;
        }
        visualComponent.setBounds((WIDTH[tSize] - width) / 2,
                      (HEIGHT[tSize] - height) / 2,
                      width, height);
    }
    
    if (controlComponent != null) {
        controlComponent.setBounds(VLEFT[tSize], VBOTTOM[tSize],
                       WIDTH[tSize], 24);
        controlComponent.invalidate();
    }
    
    remove(zoomButton);
    addZoomButton();
    repaint();
    }

    public void addZoomButton()
    {
    zoomButton = new ZoomButton(zoomImageUp[tSize], zoomImageDn[tSize], 1 - tSize);
    add(zoomButton);
    zoomButton.setBounds(showmeImage[tSize].getWidth(this) - 24, showmeImage[tSize].getHeight(this) - 24, 24, 24);
    }
    
    /**
     * This controllerUpdate function must be defined in order to
     * implement a ControllerListener interface. This 
     * function will be called whenever there is a media event
     */
    public synchronized void controllerUpdate(ControllerEvent event) 
    {
    // If we're getting messages from a dead player, 
    // just leave
    if (player == null)
        return;
    
    // When the player is Realized, get the visual 
    // and control components and add them to the Applet
    if (event instanceof RealizeCompleteEvent)
    {
        if (( visualComponent =
          player.getVisualComponent())!= null) {
        cPanel.add(visualComponent);
        }

        if (( controlComponent = 
          player.getControlPanelComponent()) != null) {
        
        add(controlComponent);
        controlComponent.setBounds(VLEFT[tSize], VBOTTOM[tSize],
                       WIDTH[tSize], 24);
        controlComponent.invalidate();
        controlComponent.repaint();
        }
        reSize();
        player.prefetch();

    } else if (event instanceof EndOfMediaEvent) 
    {
        // We've reached the end of the media; rewind and
        // start over
        player.setMediaTime(new Time(0));
        player.prefetch();
    } else if (event instanceof ControllerErrorEvent) {
        player = null;
        Fatal(((ControllerErrorEvent)event).getMessage());
    } else if (event instanceof PrefetchCompleteEvent) {
        if (visualComponent != null) {
        reSize();
        }
        player.start();
        } else if (event instanceof SizeChangeEvent) {
        reSize();
    }
    }

    void Fatal (String s) 
    {
    // Applications will make various choices about what
    // to do here. We print a message and then exit
    System.err.println("FATAL ERROR: " + s);
    throw new Error(s); // Invoke the uncaught exception
                // handler System.exit() is another
                // choice.
    
    }

    /*************************************************************************
     * INNER CLASSES
     *************************************************************************/

    public class CPanel extends Panel 
    {
        public CPanel() 
        {
            super();
            setBackground(Color.black);
            setLayout( null );
        }
    }

    public class ZoomButton extends Component
    {
        Image up, down;
        int newSize;
    
        boolean mouseUp = true;
        
        public ZoomButton(Image up, Image down, int newSize) 
        {
            this.up = up;
            this.down = down;
            this.newSize = newSize;
            setSize(24, 24);
            addMouseListener( new MouseAdapter() 
            {
                public void mousePressed(MouseEvent me) 
                {
                    mouseUp = false;
                    repaint();
                }
    
                public synchronized void mouseReleased(MouseEvent me) 
                {
                    mouseUp = true;
                    TVApplet.this.tSize = ZoomButton.this.newSize;
                    reSize();
                }
            } );
        }

        public void paint(Graphics g)
        {
            if (mouseUp)
            g.drawImage(up, 0, 0, this);
            else
            g.drawImage(down, 0, 0, this);
        }
    }
    
}    


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/09/22/902807.html,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值