首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

javax.sound.sampled.UnsupportedAudioFileException: could not get audio

2011-12-11 
jar到底如何加入classpath啊首先我觉得似懂非懂 我先说下自己的理解类似tools.jar 在环境变量里添加.%JAV

jar到底如何加入classpath啊
首先我觉得似懂非懂 我先说下自己的理解

类似tools.jar 在环境变量里添加.;%JAVA_HOME%\lib\tools.jar;

我刚在看一个mp3的程序 需要第三方的接口支持 很多教程说需要加入mp3spi这里的三个jar 分别为jl1.0 mp3spi1.9.4 和tritonus_share 都是jar文件


然后我复制了网上一个程序 貌似也是对的 把这三个文件放在java和编译好的class文件一起 因为环境变量里有"." 应该是指当前文件夹啊 和class一起的啊 因为可以运行啊

程序源码:
------------------------------------
import java.awt.BorderLayout;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.List;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

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 MusicPlayer extends Frame {
boolean isStop = true;// 控制播放线程
boolean hasStop = true;// 播放线程状态

String filepath; // 播放文件目录
String filename; // 播放文件名称
AudioInputStream audioInputStream; // 文件流
AudioFormat audioFormat; // 文件格式
SourceDataLine sourceDataLine; // 输出设备

List list;// 文件列表
Label labelfilepath; // 播放目录显示标签
Label labelfilename; // 播放文件显示标签

public MusicPlayer() {
  // 设置窗体属性
  setLayout(new BorderLayout());
  setTitle("MP3音乐播放器");
  setSize(350, 370);

  // 建立菜单栏
  MenuBar menubar = new MenuBar();
  Menu menufile = new Menu("文件");
  MenuItem menuopen = new MenuItem("打开", new MenuShortcut(KeyEvent.VK_O));
  menufile.add(menuopen);
  menufile.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
  open();
  }
  });
  menubar.add(menufile);
  setMenuBar(menubar);

  // 文件列表
  list = new List(10);
  list.addMouseListener(new MouseAdapter() {
  public void mouseClicked(MouseEvent e) {
  // 双击时处理
  if (e.getClickCount() == 2) {
  // 播放选中的文件
  filename = list.getSelectedItem();
  play();
  }
  }
  });
  add(list, "Center");

  // 信息显示
  Panel panel = new Panel(new GridLayout(2, 1));
  labelfilepath = new Label("播放目录:");
  labelfilename = new Label("播放文件:");
  panel.add(labelfilepath);
  panel.add(labelfilename);
  add(panel, "North");

  // 注册窗体关闭事件
  addWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
  System.exit(0);
  }
  });
  setVisible(true);
}

// 打开
private void open() {
  FileDialog dialog = new FileDialog(this, "Open", 0);
  dialog.setVisible(true);
  filepath = dialog.getDirectory();
  if (filepath != null) {
  labelfilepath.setText("播放目录:" + filepath);

  // 显示文件列表
  list.removeAll();
  File filedir = new File(filepath);
  File[] filelist = filedir.listFiles();
  for (File file : filelist) {
  String filename = file.getName().toLowerCase();
  if (filename.endsWith(".mp3") || filename.endsWith(".wav")) {


  list.add(filename);
  }
  }
  }
}

// 播放
private void play() {
  try {
  isStop = true;// 停止播放线程
  // 等待播放线程停止
  System.out.print("开始播放:" + filename);
  while (!hasStop) {
  System.out.print(".");
  try {
  Thread.sleep(10);
  } catch (Exception e) {
  }
  }
  File file = new File("E:\\game.mp3");
  labelfilename.setText("播放文件:" + filename);

  // 取得文件输入流
  audioInputStream = AudioSystem.getAudioInputStream(file);
  audioFormat = audioInputStream.getFormat();
  // 转换MP3文件编码
  if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
  audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
  audioFormat.getSampleRate(), 16, audioFormat
  .getChannels(), audioFormat.getChannels() * 2,
  audioFormat.getSampleRate(), false);
  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();

  // 创建独立线程进行播放
  isStop = false;
  Thread playThread = new Thread(new PlayThread());
  playThread.start();
  } catch (Exception e) {
  e.printStackTrace();
  }
}

class PlayThread extends Thread {
  byte tempBuffer[] = new byte[320];

  public void run() {
  try {
  int cnt;
  hasStop = false; // 读取数据到缓存数据
  while ((cnt = audioInputStream.read(tempBuffer, 0,
  tempBuffer.length)) != -1) {
  if (isStop)
  break;
  if (cnt > 0) {// 写入缓存数据
  sourceDataLine.write(tempBuffer, 0, cnt);
  }
  } // Block等待临时数据被输出为空
  sourceDataLine.drain();
  sourceDataLine.close();
  hasStop = true;
  } catch (Exception e) {
  e.printStackTrace();
  System.exit(0);
  }
  }

}

public static void main(String args[]) {
  new MusicPlayer();
}
}
------------------------------------

可是我运行却出错
------------------------------------
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
at MusicPlayer.play(MusicPlayer.java:129)
at MusicPlayer.access$1(MusicPlayer.java:113)
at MusicPlayer$2.mouseClicked(MusicPlayer.java:68)
at java.awt.Component.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.List.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
----------------------------------------



说找不到文件 文件名也对啊 我试着输出了文件位置 应该是正确的 我就觉得是不是没有成功引入那三个包呢。。

还是我的理解有错误 放在一起没有成功引入 要加在环境变量里吗 貌似我也试过了 不行哦 求高手给个具体的操作先

还有一般性利用第三方的接口jar文件 需要怎么做 具体一点 打个具体目录的比方给我 

或成功帮我运行下上面的这段MP3程序 谢谢了~~~

[解决办法]
linux:
java -Xbootclasspath/a:/path/thirdlib.jar: -jar yourJarExe.jar 
windows:
java -Xbootclasspath/a;/path/thirdlib.jar; -jar yourJarExe.jar 



[解决办法]
在程序里添加个文件夹 lib
把jar copy进去 选择jar包 右键,build path,add to build path就可以了
[解决办法]

探讨

可以写在,MANIFEST.MF中,如

Manifest-Version: 1.0
Class-Path: =./lib/helper.jar
Main-Class: Main

[解决办法]
在源文件目录下新建一个lib,把那三个jar文件放进去,然后运行:java -cp ".;lib/*" MusicPlayer。(先指定好要运行的spi的路径,-cp,即classPatch);

热点排行