回 帖 发 新 帖 刷新版面

主题:请教各位大虾 java如何播放音频文件

请教各位大虾 java如何播放音频,视频文件

回复列表 (共10个回复)

沙发

先下个jmf.jar 包,下面是个例子代码:

import java.awt.event.ItemEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import java.awt.event.WindowEvent;
import java.awt.event.ActionEvent;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.CheckboxMenuItem;
import java.awt.MenuBar;
import java.awt.FileDialog;
import java.awt.Container;
import java.awt.Component;
import java.awt.BorderLayout;
import java.awt.Color;
import java.io.IOException;

import javax.media.ControllerClosedEvent;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.GainControl;
import javax.media.Player;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.PrefetchCompleteEvent;
import javax.media.RealizeCompleteEvent;
import javax.media.Time;

import javax.swing.JFrame;

public class MediaPlayer extends JFrame implements ActionListener,ControllerListener,ItemListener
{
    //MediaPlayer类的变量成员声明;
    int i;
    Player player; 
    Component vc, cc, gcc;
    GainControl gc; 
    boolean first = true, loop = false; 
    String currentDirectory;

    //构造函数,其中包括了设置响应窗口事件的监听器;
    MediaPlayer(String title)
    {
        super(title);
        
        //利用一个adapter实现对用户点击窗口系统菜单的关闭按钮时的响应
        addWindowListener(new WindowAdapter()
        {            
            public void windowClosing(WindowEvent e)
            {
                //调用dispose以执行windowClosed?????????????????
                dispose();
            }
            public void windowClosed(WindowEvent e)
            {
                if(player!=null)
                player.close();
                System.exit(0);
            }
        });
        
        //调用设置程序菜单栏的方法成员完成菜单的布置
        setupMenu();
        setSize(400,400);
        setVisible(true);
    }
    
    //本方法用于设置程序菜单栏
    public void setupMenu()
    {
        //设置一个菜单
        Menu f=new Menu("文件");
        
        //往设置的菜单中添加菜单项
        MenuItem mi=new MenuItem("打开");
        mi.addActionListener(this);
        f.add(mi);
        f.addSeparator();
        CheckboxMenuItem cbmi=new CheckboxMenuItem("循环",loop);
        cbmi.addItemListener(this);
        f.add(cbmi);
        f.addSeparator();
        mi=new MenuItem("退出");
        mi.addActionListener(this);
        f.add(mi);
        
        Menu l=new Menu("播放列表");
        Menu c=new Menu("播放控制");
        MenuItem move=new MenuItem("播放");
        move.addActionListener(this);
        c.add(move);
        c.addSeparator();
        MenuItem pause=new MenuItem("暂停");
        pause.addActionListener(this);
        c.add(pause);
        c.addSeparator();
        MenuItem stop=new MenuItem("停止");
        stop.addActionListener(this);
        c.add(stop);
        c.addSeparator();
        
        //设置一个菜单栏
        MenuBar mb=new MenuBar();
        
        //将设置的菜单依次加入程序的菜单栏中去;
        mb.add(f);
        mb.add(c);
        mb.add(l);
        
        //将构造完成的菜单栏交给当前程序的窗口;
        setMenuBar(mb);
    }

板凳

//动作事件响应成员;捕捉发送到本对象的各种事件;
    public void actionPerformed(ActionEvent e)
    {
        
        //设一个字符串用于暂存打开的媒体文件的路径;
        String cufile,selectfile;
        if(e.getActionCommand().equals("退出"))
        {
            
            //调用dispose以便执行windowClosed
            dispose();
            return;
        }
        
        //此事件表明用户选择了"播放"菜单命令;
        //如果当前有一个可以播放则执行播放命令;
        if(e.getActionCommand().equals("播放"))
        {
            if(player!=null)
            {
                player.start();
            }
            return;
        }
        
        //如果当前正在播放某一个文件,则执行暂停;
        if (e.getActionCommand().equals("暂停"))
        {
            if(player!=null)
            {
                player.stop();
            }
            return;
        }
        
        //"停止"命令的响应
        if(e.getActionCommand().equals("停止"))
        {
            if(player!=null)
            {
                player.stop();
                player.setMediaTime(new Time(0));
            }
            return;
        }
        
        //拥护选择要播放的媒体文件
        if(e.getActionCommand().equals("打开"))
        {
            FileDialog fd=new FileDialog(this,"打开媒体文件",FileDialog.LOAD);
            fd.setDirectory(currentDirectory);
            fd.setVisible(true);
            
            //如果用户放弃选择文件,则返回
            if(fd.getFile()==null)
            return;
            
            //保存了所选文件的名称及其全路径名称已被稍后使用
            //同时设置当前文件夹路径
            selectfile=fd.getFile();
            currentDirectory=fd.getDirectory();
            cufile=currentDirectory+selectfile;
            
            //将用户选择的文件作为一个菜单项加入播放列表,该菜单项名为该文件名;
            //被点击后给出的命令串是该文件的全路径名
            MenuItem mi=new MenuItem(selectfile);
            mi.setActionCommand(cufile);
            MenuBar mb=getMenuBar();
            Menu m=mb.getMenu(2);
            mi.addActionListener(this);
            m.add(mi);
        }
        else
        {
            
            //程序逻辑运行到此表示用户选择了一个"播放列表"中的媒体文件
            //此时可以通过如下动作获得该文件的全路径名;
            cufile=e.getActionCommand();
            selectfile=cufile;
        }
        
        //如果已存在一个播放器,则先将其关闭,稍后重新创建
        //创建播放器时需要捕捉一些异常;
        if(player!=null)
        player.close();
        try
        {
            player=Manager.createPlayer(new MediaLocator("file:"+cufile));            
        }
        catch(IOException e2)
        {
            e2.printStackTrace();
            return;
        }
        catch(NoPlayerException e2)
        {
            System.out.println("不能找到播放器。");
            return;
        }
        if(player==null)
        {
            System.out.println("无法创建播放器。");
            return;
        }
        first=false;
        setTitle(selectfile);
        
        //设置处理播放控制器实际的对象;
        player.addControllerListener(this);
        player.prefetch();
    }

3 楼

//本方法覆盖了javax.media.ControllerEvent的抽象方法
    //控制事件响应成员;因为实现了"ControllerListener"接口,
    //本方法用于处理媒体播放器传来的事件;    
    public void controllerUpdate(ControllerEvent e)
    {
        //System.out.println("显示GUI");
        Container tainer=getContentPane();
        
        //调用player.close()时ControllerClosedEvent事件出现。
        //如果存在视觉部件,则该部件应该拆除(为一致起见,我们
        //对控制面板部件也执行同样的操作,下次需要时再构造)
        if(e instanceof ControllerClosedEvent)
        {
            if(vc!=null)
            {
                remove(vc);
                vc=null;
            }
            if(cc!=null)
            {
                remove(cc);
                cc=null;
            }
            return;
        }
        
        //播放结束时,将播放指针置为文件之首,如果设定了循环播放,则再次启动播放器;
        if(e instanceof EndOfMediaEvent)
        {
            player.setMediaTime(new Time(0));
            if(loop)
            {
                System.out.println("重放");
                player.start();
            }
            return;
        }
        
        //PrefetchCompleteEvent事件发生之后调用start,正式启动播放
        if(e instanceof PrefetchCompleteEvent)
        {
            System.out.println("完成Prefetch阶段");
            
            player.start();
            
            return;
        }
        
        //本事件表示由于用于播放的资源已经确定;此时要将媒体的图形conponent
        //(如果有)显示出来,同时将播放器player的控制器显示到窗口里;
        if(e instanceof RealizeCompleteEvent)
        {
            System.out.println("完成Realize阶段");
            
            //如果媒体中有图象,将对应图象conponent载入窗体;
            vc=player.getVisualComponent();
            if(vc!=null)
            tainer.add(vc,BorderLayout.CENTER);
            
            
            //将对应控制器conponent载入窗体;
            cc=player.getControlPanelComponent();
            cc.setBackground(Color.BLUE);
            if(cc!=null)
            tainer.add(cc,BorderLayout.SOUTH);
            
            //有一些特殊媒体在播放时提供另外的控制手段,将该控制器一并加入窗口;
            
            gc=player.getGainControl();
            gcc=gc.getControlComponent();
            if(gcc!=null)
            {
                tainer.add(gcc,BorderLayout.NORTH);
            }
            
            //根据媒体文件中是否有图象,设定相应的窗口大小
            if(vc!=null)
            {
                pack();
                return;
            }
            else
            {
                setSize(300,75);
                setVisible(true);
                return;
            }
        }
    }

4 楼

//菜单状态改变事件的响应函数;
    public void itemStateChanged(ItemEvent e)
    {
        int j;
        i=++i;
        j=i%2;
        if(j==1)
        {
            System.out.println("启动循环");
            loop=!loop;
        }
        if(j==0)
        {
            System.out.println("关闭循环");
            loop=!loop;
        }
        
    }
    
    //绘图函数成员;
    public void paint(Graphics g)
    {
        
        //调用超类JFrame的paint()方法,该paint()方法将调用JFrame包含的各个容器
        //和部件(包括控制面板部件)的paint()方法。
        super.paint(g);
        
        //以下代码实现了在开启程序之初显示欢迎界面
        if(first)
        {
            int w=getSize().width;
            int h=getSize().height;
            g.setColor(Color.magenta);
            g.fillRect(0,0,w,h);
            Font f=new Font("DialogInput",Font.BOLD,18);
            g.setFont(f);
            FontMetrics fm=g.getFontMetrics();
            int swidth=fm.stringWidth("简单媒体播放器");
            g.setColor(Color.white);
            g.drawString("简单媒体播放器",(w-swidth)/2,(h+getInsets().top)/2);
        }
    }
    
    //不执行背景清除操作,以免控制面板部件闪烁
    //同时使得本程序在用鼠标拖动窗口时存在一些没有及时重绘的情况,有待改进
    public void update(Graphics g)
    {
        paint(g);
    }
    public static void main(String[] args)
    {
        new MediaPlayer("媒体播放器");
    }
}

5 楼

//菜单状态改变事件的响应函数;
    public void itemStateChanged(ItemEvent e)
    {
        int j;
        i=++i;
        j=i%2;
        if(j==1)
        {
            System.out.println("启动循环");
            loop=!loop;
        }
        if(j==0)
        {
            System.out.println("关闭循环");
            loop=!loop;
        }
        
    }
    
    //绘图函数成员;
    public void paint(Graphics g)
    {
        
        //调用超类JFrame的paint()方法,该paint()方法将调用JFrame包含的各个容器
        //和部件(包括控制面板部件)的paint()方法。
        super.paint(g);
        
        //以下代码实现了在开启程序之初显示欢迎界面
        if(first)
        {
            int w=getSize().width;
            int h=getSize().height;
            g.setColor(Color.magenta);
            g.fillRect(0,0,w,h);
            Font f=new Font("DialogInput",Font.BOLD,18);
            g.setFont(f);
            FontMetrics fm=g.getFontMetrics();
            int swidth=fm.stringWidth("简单媒体播放器");
            g.setColor(Color.white);
            g.drawString("简单媒体播放器",(w-swidth)/2,(h+getInsets().top)/2);
        }
    }
    
    //不执行背景清除操作,以免控制面板部件闪烁
    //同时使得本程序在用鼠标拖动窗口时存在一些没有及时重绘的情况,有待改进
    public void update(Graphics g)
    {
        paint(g);
    }
    public static void main(String[] args)
    {
        new MediaPlayer("媒体播放器");
    }
}

6 楼

一下子不能  全部 发 ,只好分开回复了

7 楼


import javax.media 在哪个网上可以下载?

8 楼



import javax.media 在哪个网上可以下载?

9 楼

这的用到javax.media包,到sun公司下

10 楼

http://java.sun.com/webapps/download/Redirect/30977658/584747937728280705350560724608606933322893863359466947722807053505763202594105280732152819601360132859339008063305596058473206-5761/jmf-2_1_1c-windows-i586.exe

我来回复

您尚未登录,请登录后再回复。点此登录或注册