mp3-java编的音乐播放器,只能播放部分MP3文件

问题描述

java编的音乐播放器,只能播放部分MP3文件

import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;

public class Player {
private String path;//文件路径
private String name;//文件名称
private AudioFormat audioFormat;//播放格式
private AudioInputStream audioInputStream;//音乐播放输入流
private SourceDataLine sourceDataLine;// 播放设备
private boolean isStop = false;// 播放停止标志
/**
* 创建对象时需要传入播放路径及文件名称
* @param path
* @param name
/
public Player(String path ,String name) {
this.path = path;
this.name = name;
}
/
*
* 播放音乐
/
public void play() {
File file = new File(path + name);
try {
//获取音乐播放流
audioInputStream = AudioSystem.getAudioInputStream(file);
//获取播放格式
audioFormat = audioInputStream.getFormat();
/*System.out.println("取样率:"+ audioFormat.getSampleRate());
Map map = audioFormat.properties();
Iterator it = map.entrySet().iterator();
while(it.hasNext()) {
Map.Entry m = (Entry) it.next();
System.out.println(m.getKey()+":"+m.getValue());
}
/
//其它格式音乐文件处理
if(audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, audioFormat.getSampleRate(), 16, audioFormat.getChannels(), audioFormat.getChannels()*2, audioFormat.getSampleRate(), audioFormat.isBigEndian());
audioInputStream = AudioSystem.getAudioInputStream(audioFormat, audioInputStream);

}

        //打开输出设备
        DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat,AudioSystem.NOT_SPECIFIED);
        sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
        sourceDataLine.open(audioFormat);
        sourceDataLine.start();
        //启动播放线程
        new Thread() {
            @Override
            public void run() {
                try {
                    int n = 0;
                    byte tempBuffer[] = new byte[320];
                    while(n != -1) {
                        //停止播放入口,如果isStop被置为真,结束播放
                        if(isStop) break;
                        //将音乐输入流的数据读入tempBuffer缓存
                        n = audioInputStream.read(tempBuffer,0 , tempBuffer.length);
                        if(n>0) {
                            //将缓存数据写入播放设备,开始播放
                            sourceDataLine.write(tempBuffer, 0, n);
                        }
                    }
                    audioInputStream.close();
                    sourceDataLine.drain();
                    sourceDataLine.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    throw new RuntimeException();
                }
            }
        }.start();
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(0);
        throw new RuntimeException();
    }
}
/**
 * 停止播放
 */
public void stop() {
            try {
                isStop = true;
                audioInputStream.close();
                sourceDataLine.drain();
                sourceDataLine.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
}

}

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Vector;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;

import com.zy.play.Player;

public class MusicPanel extends JFrame{

private JButton add, playbtn, stopbtn, deletebtn, deleteAllbtn, upbtn, downbtn;//播放、停止、删除、删除全部、向上。向下按钮
private JTable table; //歌曲信息表
private Player player;
private JPanel jpl1,jpl2;
public MusicPanel() {
    initCompont();
}
/**
 * 初始化界面
 */
private void initCompont() {
    //各个按钮赋初始值
    add = new JButton("导入");
    playbtn = new JButton("试听");
    stopbtn = new JButton("停止");
    deletebtn = new JButton("单曲删除");
    deleteAllbtn = new JButton("全部删除");
    upbtn = new JButton("上一首");
    downbtn = new JButton("下一首");

    //导入按钮点击设置
    add.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            addFile();
        }
    });

    //试听按钮点击设置
    playbtn.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            if(player!=null) {
                player.stop();
                player = null;
            }
            int rowNum = table.getSelectedRow();
            if(rowNum != -1) {
                player = new Player((String)table.getValueAt(rowNum, 1) + "\" ,(String)table.getValueAt(rowNum, 0));
                System.out.println((String)table.getValueAt(rowNum, 1)+"\"+(String)table.getValueAt(rowNum, 0));
                player.play();
            }
        }
    });

    //停止按钮点击设置
    stopbtn.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            if(player != null) {
                player.stop();
                player = null;
            }
        }
    });

    //单曲删除按钮点击设置
    deletebtn.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int rowNum = table.getSelectedRow();
            if(rowNum != -1) {
                ((DefaultTableModel)table.getModel()).removeRow(rowNum);
            }
        }
    });

    //删除全部按钮点击设置
    deleteAllbtn.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            for(int i = table.getRowCount()-1; i>=0; i--) {
                ((DefaultTableModel)table.getModel()).removeRow(i);
            }
        }
    });

    downbtn.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int n = table.getSelectedRow() + 1;
            if(n < table.getRowCount()) {
                table.setRowSelectionInterval(n, n);
            }
        }
    });

    upbtn.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int n = table.getSelectedRow() - 1;
            if(n < -1) {
                n = table.getRowCount() - 1;
            }
            if(n >= 0) {
                table.setRowSelectionInterval(n, n);
            }
        }

    });

    //添加各个按钮
    jpl1= new JPanel(new GridLayout(1,7));
    jpl1.add(add);
    jpl1.add(playbtn);
    jpl1.add(stopbtn);
    jpl1.add(deletebtn);
    jpl1.add(deleteAllbtn);
    jpl1.add(upbtn);
    jpl1.add(downbtn);
    //this.setLayout(new BorderLayout());
    this.add(jpl1,"North");

    Vector<String> tableContent = new Vector<String>(); //表格内容
    Vector<String> columnName = new Vector<String>();//歌曲信息表格列名称
    columnName.add("歌曲名称");
    columnName.add("存放路径");

    //设置table
    table = new JTable(tableContent, columnName);
    table.setSelectionBackground(Color.blue);
    table.setSelectionForeground(Color.LIGHT_GRAY);
    jpl2=new JPanel();

    jpl2.add(new JScrollPane(table), BorderLayout.CENTER);
    this.add(jpl2,"Center");
    this.setSize(650, 210);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

/**
 * 添加文件
 */
private void addFile() {
    JFileChooser fc =  new JFileChooser();
    //设置选入文件类型
    FileNameExtensionFilter filter = new FileNameExtensionFilter("mp3 or wav file", "mp3","wav","MP3","WAV");
    fc.setFileFilter(filter);
    fc.setFileSelectionMode(JFileChooser.FILES_ONLY);//设置只选择文件
    fc.setMultiSelectionEnabled(true);//设置选择多个文件
    int intRetVal = fc.showDialog(this, "打开");
    //获取文件并添加到table
    if(intRetVal == JFileChooser.APPROVE_OPTION) {
        File[] file = fc.getSelectedFiles();
        String name;
        for(File var : file) {
            name = var.getName().toLowerCase();
            if( name.endsWith(".mp3")|| name.endsWith(".wav")) {
                this.addMusicItem(var.getName() , var.getParentFile().getAbsolutePath());
            }
        }
    }
}

/**
 * table的行中添加音乐文件名称name,音乐文件路径path
 * @param name
 * @param path
 */
private void addMusicItem(String name, String path ) {
    Vector<String> rowData = new Vector<String>();
    rowData.add(name);
    rowData.add(path);
    //rowData.add(time);

    DefaultTableModel tabMod= (DefaultTableModel) table.getModel();
    tabMod.addRow(rowData);
}

public static void main(String[] args) {
    MusicPanel test=new MusicPanel();
}

}


报错:java.io.IOException: Resetting to invalid mark

解决方案

一些文件格式不正确,虽然它们有mp3的扩展名,但是不是mp3的。
参考:
http://stackoverflow.com/questions/17823542/conflicting-jar-methods
http://stackoverflow.com/questions/10046136/error-while-playing-some-mp3s-using-javazoom-basicplayer-classes

解决方案二:

想要播放更多格式,请参考JJMPEG。

时间: 2024-09-29 09:14:18

mp3-java编的音乐播放器,只能播放部分MP3文件的相关文章

java播放器-嵌入windowsplayer播放器怎么播放放在服务器上的音乐文件

问题描述 嵌入windowsplayer播放器怎么播放放在服务器上的音乐文件 就是用这个读取windowsplayer的播放器的注册表,现在要达到的一个功能是要播放服务器上的音乐文件,音乐文件是放在服务器的本地上的

android音乐播放器中播放模式的设计

在音乐播放器中,播放模式一般放在音乐播放完毕后自动识别,如下给出逻辑代码,可根据需要添加合适 的代码 public static final int ALL = 0;//全部循环 public static final int SINGLE = 1;//单曲循环 public static final int RANDOM = 2;//随机 // 一首歌播放完成后(这里设置播放模式) public class Completed implements OnCompletionListener {

Goggles Music Manager 0.12.4发布 音乐管理器和播放器

Goggles http://www.aliyun.com/zixun/aggregation/6141.html">Music Manager是一个音乐管理器和播放器.支持自动分类的格式有:Ogg Vorbis,FLAC,MP3,MP4,ASF,Musepack文件,根据类型.艺术家.专辑和歌曲.支持连续播放,标签编辑功能,可从last-fm上抓取音轨. Goggles Music Manager 0.12.4此版本添加了葡萄牙语翻译,提高了守护程序的兼容性,支持最新的FOX 1.7.2

怎么实现音乐播放器的播放模式

问题描述 怎么实现音乐播放器的播放模式 为了进一步完善音乐播放器,怎么实现音乐播放器的播放模式(单曲播放,循环播放,随机播放,顺序播放)?由于涉及的知识点还没学,求大神帮帮忙吧 解决方案 用一个值来保存播放模式 在每首歌播放结束的逻辑(mediaplayer 的OnSeekCompleteListener中)去处理播放逻辑, 如果单曲循环, 继续播放当前歌曲; 如果是循环播放模式: 当前播放歌曲 = (当前播放歌曲+1 ) % (歌曲总数);如果是随机播放, 当前歌曲 = random() (范

为何CD播放器不能播放续刻的歌曲

问:我将一些歌曲分别刻录在CD-R光盘上,在电脑上可以正常播放所有歌曲,但在CD播放机上只能播放第一次刻录的歌,续刻的歌就不能播放.请问这是什么原因造成的啊? 答:CD播放机只能识别第一区段的轨道(一首歌使用一条音轨).如果你使用续刻的方式刻录出多区段光盘(Multi-Session CD),CD播放机只能播放第一区段的歌曲.要想解决这个问题,你应该在刻录光盘时最好用Joliet 模式而不是ISO9660模式刻录音频CD,并将刻录方式选择为"无多区段"(Close Session),使

嵌入播放器-网站中用realplayer播放器不能播放电影名为中文的电影

问题描述 网站中用realplayer播放器不能播放电影名为中文的电影 网站中用realplayer播放器不能播放电影名为中文的电影.怎么解决啊?非常感谢

c#-想要获取当前播放器正在播放的视频文件的名称该怎么写?

问题描述 想要获取当前播放器正在播放的视频文件的名称该怎么写? 想要获取当前播放器正在播放的视频文件的名称该怎么写?想做一个小实例,但是到这里不知道该怎么写了. 解决方案 你们用jquery吗,可以获取到节点的名称在操作吗

android播放器点播放后,出现以下错误,求大神帮忙解决

问题描述 android播放器点播放后,出现以下错误,求大神帮忙解决 解决方案 权限设置没设置,要在配置文件把android.permission.access_network_state这个权限加进去

flash-问: 10 我想做一个winform的播放器来播放斗鱼的直播,求大神指点。

问题描述 问: 10 我想做一个winform的播放器来播放斗鱼的直播,求大神指点. 目前没有思路,希望大神出来指点一二.我试过了很多种,利用flash 的插件也无法实现. 解决方案 webbrowser里面加载http://www.douyutv.com/ 解决方案二: 想做一个推荐系统,求志同道合者...

Goggles Music Manager 0.12.3发布 音乐管理器和播放器

Goggles http://www.aliyun.com/zixun/aggregation/6141.html">Music Manager是一个音乐管理器和6186.html">播放器.支持自动分类的格式有:Ogg Vorbis,FLAC,MP3,MP4,ASF,和Musepack文件,根据类型,艺术家,专辑和歌曲.支持连续播放,标签编辑功能,可从last-fm上抓取音轨. Goggles Music Manager 0.12.3版本更新了OpenGL,修复了并行构建