若用Java开发MP3播放器,自己按MP3标准写译码器,译出来后的二进制数据流怎么播放出来呢?
另外各位大大知道有类似的代码可以参考么?

解决方案 »

  1.   

    可以去看看sun的media的API这几天我也正想做个门禁系统,也要处理音频和视频,也在学习这些东西。
    去sun的主页下载media的api吧!那里还要论坛,可以和大家交流!
      

  2.   

    可以参看一下Media Framework 
    下面是一个mp3的实例:
    import javax.media.*;
    import javax.swing.UIManager;
    import java.awt.*;
    import java.awt.event.*;class MediaPlayer extends Frame implements ActionListener, ControllerListener,
    ItemListener {
    private static final long serialVersionUID = 1L;
    Player player;
    Component vc, cc;
    boolean first = true, loop = false;
    String currentDirectory;
    MediaPlayer(String title)
    {
    //构造函数
    super(title);
    addWindowListener
    (new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    // 用户点击窗口系统菜单的关闭按钮
    // 调用dispose以执行windowClosed
    dispose();
    }
    public void windowClosed(WindowEvent e)
    {
    if (player != null)
    player.close();
    System.exit(0);
    }
    });
    try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
    e.printStackTrace();
    } Menu m = new Menu("文件"); MenuItem mi = new MenuItem("打开"); mi.addActionListener(this); m.add(mi); m.addSeparator(); CheckboxMenuItem cbmi = new CheckboxMenuItem("循环", false); cbmi.addItemListener(this); m.add(cbmi); m.addSeparator(); mi = new MenuItem("退出"); mi.addActionListener(this); m.add(mi); MenuBar mb = new MenuBar(); mb.add(m); setMenuBar(mb); setSize(200, 200); setVisible(true); }
    public void actionPerformed(ActionEvent e)
    {
    if (e.getActionCommand().equals("退出"))
    {
    // 调用dispose以便执行windowClosed
    dispose();
    return;
    }
    FileDialog fd = new FileDialog(this, "打开媒体文件",FileDialog.LOAD);
    fd.setDirectory(currentDirectory); fd.show(); // 如果用户放弃选择文件,则返回 if (fd.getFile() == null)
    return; currentDirectory = fd.getDirectory(); if (player != null) player.close(); try { player = Manager.createPlayer(new MediaLocator ("file:" + fd.getDirectory() + fd.getFile())); } catch (java.io.IOException e2) { System.out.println(e2); return; } catch (NoPlayerException e2) { System.out.println("不能找到播放器."); return; } if (player == null) { System.out.println("无法创建播放器."); return; } first = false; setTitle(fd.getFile()); player.addControllerListener(this); player.prefetch(); } public void controllerUpdate(ControllerEvent e) { // 调用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) { if (loop) { player.setMediaTime(new Time(0)); player.start(); } return; } if (e instanceof PrefetchCompleteEvent) { player.start(); return; } if (e instanceof RealizeCompleteEvent) { vc = player.getVisualComponent(); if (vc != null) add(vc); cc = player.getControlPanelComponent(); if (cc != null) add(cc, BorderLayout.SOUTH); pack(); } } public void itemStateChanged(ItemEvent e) { loop = !loop; } public void paint(Graphics g) { if (first) { int w = getSize().width; int h = getSize().height; g.setColor(Color.blue); g.fillRect(0, 0, w, h); Font f = new Font("DialogInput", Font.BOLD, 16); g.setFont(f); FontMetrics fm = g.getFontMetrics(); int swidth = fm.stringWidth("*** 欢迎 ***"); g.setColor(Color.white); g.drawString("*** 欢迎 ***", (w - swidth) / 2, (h + getInsets().top) / 2);
    }
    // 调用超类Frame的paint()方法,该paint()方法将调用Frame包含的各个容器 // 和部件(包括控制面板部件)的paint()方法。
    super.paint(g);
    }
    // 不执行背景清除操作,以免控制面板部件闪烁
    public void update(Graphics g)
    {
    paint(g);
    }
    public static void main(String[] args) {
    new MediaPlayer("媒体播放器1.0");
    }}