【问题标题】:Sound will not play from jar, but only when i run it from NetBeans. (Javazoom player)声音不会从 jar 播放,但只有当我从 NetBeans 运行它时才会播放。 (Javazoom 播放器)
【发布时间】:2015-11-17 03:54:45
【问题描述】:

我已经下载并导入了 JLayer 1.0.1 (http://www.javazoom.net/javalayer/sources.html)

如果我从 NetBeans 运行此代码,我可以播放声音

package window;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.AudioDevice;
import javazoom.jl.player.FactoryRegistry;
import javazoom.jl.player.advanced.AdvancedPlayer;

/**
 * Provide basic playing of MP3 files via the javazoom library.
 * See http://www.javazoom.net/
 * 
 * @author David J. Barnes and Michael Kölling
 * @version 2011.07.31
 */
public class MusicPlayer
{
    // The current player. It might be null.
    private AdvancedPlayer player;

    /**
     * Constructor for objects of class MusicFilePlayer
     */
    public MusicPlayer()
    {
        player = null;
    }

    /**
     * Play a part of the given file.
     * The method returns once it has finished playing.
     * @param filename The file to be played.
     */
    public void playSample(String filename)
    {
        try {
            setupPlayer(filename);
            player.play(500);
        }
        catch(JavaLayerException e) {
            reportProblem(filename);
        }
        finally {
            killPlayer();
        }
    }    

    /**
     * Start playing the given audio file.
     * The method returns once the playing has been started.
     * @param filename The file to be played.
     */
    public void startPlaying(final String filename)
    {
        try {
            setupPlayer(filename);
            Thread playerThread = new Thread() {
                public void run()
                {
                    try {
                        player.play(5000);
                    }
                    catch(JavaLayerException e) {
                        reportProblem(filename);
                    }
                    finally {
                        killPlayer();
                    }
                }
            };
            playerThread.start();
        }
        catch (Exception ex) {
            reportProblem(filename);
        }
    }

    public void stop()
    {
        killPlayer();
    }

    /**
     * Set up the player ready to play the given file.
     * @param filename The name of the file to play.
     */
    private void setupPlayer(String filename)
    {
        try {
            InputStream is = getInputStream(filename);
            player = new AdvancedPlayer(is, createAudioDevice());
        }
        catch (IOException e) {
            reportProblem(filename);
            killPlayer();
        }
        catch(JavaLayerException e) {
            reportProblem(filename);
            killPlayer();
        }
    }

    /**
     * Return an InputStream for the given file.
     * @param filename The file to be opened.
     * @throws IOException If the file cannot be opened.
     * @return An input stream for the file.
     */
    private InputStream getInputStream(String filename)
        throws IOException
    {
        return new BufferedInputStream(
                    new FileInputStream(filename));
    }

    /**
     * Create an audio device.
     * @throws JavaLayerException if the device cannot be created.
     * @return An audio device.
     */
    private AudioDevice createAudioDevice()
        throws JavaLayerException
    {
        return FactoryRegistry.systemRegistry().createAudioDevice();
    }

    /**
     * Terminate the player, if there is one.
     */
    private void killPlayer()
    {
        synchronized(this) {
            if(player != null) {
                player.stop();
                player = null;
            }
        }
    }

    /**
     * Report a problem playing the given file.
     * @param filename The file being played.
     */
    private void reportProblem(String filename)
    {
        System.out.println("There was a problem playing: " + filename);
    }

}

我可以像这样从另一个类中调用它

private MusicPlayer player = new MusicPlayer();
player.startPlaying("src/audio/SuperheroKeygen.mp3"); 

音频文件也被导入到项目中。

但是,如果我运行 .jar,我就听不到音频

如果我用 Winrar 打开 .jar 文件,我会立即获得一个文件夹音频,其中包含我的 mp3,因此 mp3 包含在 .jar 中

从命令行运行 jar 给了我

播放时出现问题:src/audio/SuperheroKeygen.mp3
线程“Thread-2”中的异常 java.lang.NullPointerException
在 window.MusicPlayer$1.run(MusicPlayer.java:64)

PS Java 新手

【问题讨论】:

  • 我假设您的 JAR 旁边没有一个名为 src 的文件夹,其中包含一个名为 audio 的文件夹,其中包含一个名为 SuperheroKeygen.mp3 的文件,因为这是您的程序正在寻找声音的地方文件。
  • player.startPlaying("SuperheroKeygen.mp3");删除 url 路径,只需给它一个文件名,该文件应该在您尝试运行 jar 文件的同一目录中。这样做你就会知道问题出在哪里。路径问题,否则

标签: java jar netbeans-8


【解决方案1】:

jar 文件可能不是您的播放器可以访问的文件路径。你可以做几件事。您可能必须像这样将文件复制到本地磁盘:

Path soundPath = Files.createTempFile("SuperheroKeygen", ".mp3");
try (InputStream jarSound= getClass().getResourceAsStream("/src/audio/SuperheroKeygen.mp3")){
    Files.copy(jarSound, soundPath, StandardCopyOption.REPLACE_EXISTING);        
} catch (IOException e){
    //handle the exception
}

然后soundPath 包含您可以传递给播放器的声音文件的路径。

您可能只需要更改它,以便在您的getInputStream 方法中,您只需使用getClass().getResourceAsStream() 来获取您的InputStream,而不是创建一个新的FileInputStream。如果你这样做,你必须以 / 开始你的资源路径,以便它从根目录而不是当前包目录开始:

private InputStream getInputStream(String filename) throws IOException {
    return new BufferedInputStream(getClass().getResourceAsStream(filename));
}

您可以使用 ClassLoader 将所有文件名作为绝对路径读取,这样您就不需要像这样的前导 /

private InputStream getInputStream(String filename) throws IOException {
    return new BufferedInputStream(getClass().getClassLoader().getResourceAsStream(filename));
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2013-08-03
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多