小弟在写一Socket程序,类似于QQ的,现在有一问题,就是用JMF来播放消息提示音。如果直接在Eclipse中运行是正常的,如果打成jar包放进虚拟机里面就会出现下面的异常,声音文件我也有打包进去,但是现在是提示下面是异常和我写的播放声音的类,请各位大侠拍砖!javax.media.NoPlayerException: Cannot find a Player for :jar:file:/C:/fat.jar!/t
ones/msg.wav
        at javax.media.Manager.createPlayerForContent(Manager.java:1412)
        at javax.media.Manager.createPlayer(Manager.java:417)
        at javax.media.Manager.createRealizedPlayer(Manager.java:553)
        at com.nothing.sound.WavPlay.play(WavPlay.java:29)
        at com.nothing.util.Tools.playWav(Tools.java:215)
        at com.nothing.socket.c.Client.setHasMsg(Client.java:128)
        at com.nothing.socket.c.CtoSThread.run(CtoSThread.java:79)
Exception in thread "Thread-3" java.lang.NullPointerException
        at com.nothing.sound.WavPlay.play(WavPlay.java:40)
        at com.nothing.util.Tools.playWav(Tools.java:215)
        at com.nothing.socket.c.Client.setHasMsg(Client.java:128)
        at com.nothing.socket.c.CtoSThread.run(CtoSThread.java:79)
-------------------------------分哥线------------------------------
package com.nothing.sound;import java.io.File;
import java.io.IOException;
import java.net.URL;import javax.media.CannotRealizeException;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.Player;import com.nothing.clients.Nothing;import sun.audio.AudioStream;public class WavPlay implements ControllerListener{ Player player = null;
public WavPlay() {} public void play(String path) {
URL url = Nothing.class.getResource(path);
MediaLocator mediaLocator = new MediaLocator(url);
try {
player = Manager.createRealizedPlayer(mediaLocator);
} catch (NoPlayerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CannotRealizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
player.addControllerListener (this);
player.prefetch();
player.start();
} @Override
public void controllerUpdate(ControllerEvent e) {
// TODO Auto-generated method stub
if (e instanceof EndOfMediaEvent) { 
            player.stop();
            player.close();
            return; 
        }
}
}

解决方案 »

  1.   

    javax.media.NoPlayerException: Cannot find a Player for :jar:file:/C:/fat.jar!/t
    ones/msg.wav
    前面多了个“jar:”
      

  2.   

    应该不是吧。注意看提示信息,这个是打成jar包的路径。上面提示Cannot find a Player for :jar:file:/C:/fat.jar!/t
    ones/msg.wav 并不是Cannot find a file:/……。
      

  3.   

    你输出你的url看下,jmf中文件路径的格式是以file:开头
      

  4.   

    构造媒体定位器的时候可以不用获取URL,直接用文件路径构造,MediaLocator mediaLocator = new MediaLocator("file:" + filePath);
      

  5.   

    谢谢哥们
    这个没错
    我输出了下:file:/E:/works/java/workspace/NOTHING/bin/tones/msg.wav
    刚刚我又试了下,在本机环境中运行jar包是正常的,声音也可以正常播放。
    但放到虚拟机里面就不行了,我也是虚拟机里面装了JMF,但还是不行。
      

  6.   

    那估计是jmf不能解析jar包路径下的媒体文件,只能把jar包里的媒体文件提取出来单独放个文件夹里了,或者不用jmf,java里貌似有个javax.sound.sampled也可以播放音频, 你可以试一下