java - Java 中的音频 : Why am I getting `null` ?

标签 java audio javasound

以下代码运行,但打印 null。最终目标是播放歌曲,并能够通过按取消按钮来停止它。有任何想法吗?谢谢..

这是我的代码:

if (song.equals("Dan + Shay - 19 You + Me")){//if this song is selected...
        try{
            stopPlay();
            AudioInputStream audio = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("C:\\Stuff\\Grade Twelve\\Computer Programming\\Unit 4\\Step 3\\GuitarForBeginners\\src\\guitarforbeginners\\resources\\You+Me.wav"));
            clip = AudioSystem.getClip();
            clip.open(audio);
            clip.start();
        } catch(Exception e){
            stopPlay();
            System.err.println(e.getMessage());
}

最佳答案

我认为问题可能出在您处理音频文件的方式上。由于您有完整的路径,因此您只需输入文件位置即可省去“getClass().getResourceAsStream()”部分。

这种形式的 getAudioInputStream() 的规范位于以下 URL: getAudioInputStream(File file)

我认为 getResource() 和 getResourceAsStream() 更适合加载打包在 jar 文件中的资源,您需要知道并使用 jar 文件的文件位置或 URL。 AFAIK,通过使用 getResource(String name) 和 getResourceAsStream(String name),您会自动在指定字符串“name”前面添加主机对象的文件位置前缀,从而创建一个非常困惑的文件名。这些方法的规范中使用的术语“绝对”是指宿主对象的绝对位置。 getResourceAsStream(String name) 的规范中有一些关于如何构造地址的信息。和 getResource(String name) .

另一个预防措施(感谢安德鲁指出这一点):如果您确实需要使用类文件的地址作为 anchor 或起点,那么对于音频文件来说,使用 getResource(字符串名称)而不是 getResourceAsStream(字符串名称)。后者返回一个InputStream,并且InputStreams 可能会检查标记或重置流的能力。音频文件似乎并不总是具有此功能,因此可能会引发错误。 getResource(String name)返回一个URL,该URL可以作为getAudioInputStream(URL url)的输入参数,绕过InputStream的使用。

关于java - Java 中的音频 : Why am I getting `null` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20924352/

相关文章:

java - 剪辑第二次不播放声音

java - 何时使用 concurrenthashmap 与 hashmap 进行 put 和 get

java - 导入 com.google.api.services.samples.youtube.cmdline.Auth;

c# - 在 wp8.1 rt 中播放来自应用程序的通知音

php - 使用php播放任何视频中的音频

java - 如何从视频文件中提取音频并将其作为JavaSound AudioInputStream?

java - 如何在用户不看到它的情况下打开它?

java - Java 方法的最大大小

java - 在后端(java spring boot)排序中,如何使用可分页的别名进行排序?没有父表作为前缀

javascript - 将音频从浏览器保存到后端(Django)