java - 从包装中读取声音的路径

标签 java audio clip

我有一个Sons课,可以加载和播放声音。还有一个包含主类的adhd类,并使用此Sons类。

我所有的类(class)都在“adhd”包中,我在 jar 里的声音是这样的:1.wav在 jar 里的SoundN中。 (ADHD.jar / SoundN / 1.wav)。

当我在Eclipse中运行代码时,它可以工作,但是当我运行jar时,它却不能。对于我来说,保持声音“加载”非常重要,因为我需要程序来快速读取声音,因为我正在使用计时器。你建议我做什么?

这是我的Sons类的代码,该代码在单例实例中加载声音。

儿子

package adhd;

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.FloatControl; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.SourceDataLine; 
import javax.sound.sampled.UnsupportedAudioFileException;
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.URL;

public class Sons {
    private static String PATH=null;
    private static Sons instance;
    private final Map<String, Clip> sons;
    private boolean desactive;

    Sons(String path) {
        PATH = path;
        sons = new HashMap<String, Clip>();
    }


    public void load(String nom) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
        Clip clip = AudioSystem.getClip();
        clip.open(AudioSystem.getAudioInputStream(getClass().getResourceAsStream(PATH + nom)));
        sons.put(nom, clip);
    }


    public void play(String son) {
        if(!desactive) try {
            Clip c = getSon(son);
            c.setFramePosition(0);
            c.start();
        } catch(Exception e) {
            System.err.println("Impossible to play the sound " + sound);
            desactive = true;
        }
    }
}

这是adhd类,其中包含使用声音的主体

主分类:adhd
public static void main(String[] args) {

    Sons sonN= new Sons("/SoundN/");

    try {
        sonN.load("1.wav");
    } catch (UnsupportedAudioFileException | IOException
            | LineUnavailableException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    sonN.play("1.wav");
}

这也是树的图片

最佳答案

现在,由于出现异常消息,我们知道了问题所在。问题不在于声音无法加载或无法在 jar 中找到。问题是,正如the javadoc所说:

These parsers must be able to mark the stream, read enough data to determine whether they support the stream, and, if not, reset the stream's read pointer to its original position. If the input stream does not support these operation, this method may fail with an IOException.



当从jar加载资源时,由Class.getResourceAsStream()返回的流不支持这些操作。因此,您可以做的是将输入流中的所有内容读取到内存中的字节数组中,从该字节数组中创建一个ByteArrayInputStream,然后将该流传递给AudioSystem.getAudioInputStream()

如果由于声音很长而无法将所有内容加载到内存中(但我想您不会将其放入jar中),那么可以将其写入临时文件,然后将FileInputStream传递给AudioSystem.getAudioInputStream()

关于java - 从包装中读取声音的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23041673/

相关文章:

java - 如何使用 jersey 在 Java IDE 中完全模拟客户端-服务器 Restful Web 服务,而无需部署到 Web 服务器?

iOS 以恒定音量播放声音文件,独立于用户设置

java - 如何在连续按下 JButton 的同时使用 Clip 更流畅地播放音频文件

java - Android - 在 Activity 类 android.app.application 中找不到方法 playaudio(View)

java - int[] 和 Integer[] 数组 - 有什么区别?

android - 在 Android 中静音全局声音

audio - 音频格式存储为ascii

ios - 如何在其父 View 范围之外启用 View 触摸?

javascript - 在 Canvas 中创建复合剪辑

java - 为什么不推荐使用 java.io.File?