当前位置: 首页 > 面试题库 >

音频文件在Eclipse IDE中播放;但不是JAR文件

魏鸿哲
2023-03-14
问题内容

我正在使用的音频文件位于以下位置:http :
//www.orangefreesounds.com/loud-alarm-clock-sound/

这是我在Eclipse IDE中的文件结构: 我的文件结构是什么样的

当我在IDE中运行该音频文件时,它的播放效果非常好,但是当
将其导出为JAR文件时,该文件却不能正常播放。我已经检查并发现音频文件
在JAR文件中。

我正在使用终端命令java -jar Sandbox.jar &来运行JAR文件。
该程序似乎能够找到该文件(因为它没有抛出
IOException),但是似乎无法执行播放。

为什么会发生此问题,我该如何解决?

奇怪的更新
好的,实际上,在Windows 8.1
cmd或PowerShellWindows 8.1上运行时,JAR文件能够播放音频文件,但
由于某些原因,无法在Ubuntu 14.04终端中运行。一直以来,我一直在尝试在
Ubuntu 14.04中运行JAR文件。

奇怪的更新#2
我已经确认JAR文件仅在Windows 8.1
系统上起作用的问题。这个问题中的两个代码段都
不起作用,而MadProgrammer的两个解决方案都可以工作。

最小,完整和可验证的示例(不适用于Windows或
Ubuntu)

import java.io.IOException;
import java.net.URL;
import javax.sound.sampled.*;

public class Sandbox
{

    public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException
    {
        URL url = Sandbox.class.getResource("/sound-effects/alarmSoundClip.wav");
        AudioInputStream ais = AudioSystem.getAudioInputStream(url);
        AudioFormat af = ais.getFormat();
        DataLine.Info info = new DataLine.Info(Clip.class, af);

        Clip clip = (Clip) AudioSystem.getLine(info);
        clip.open(ais);
        clip.start();
    }

}

尝试的解决方案1(在Windows或Ubuntu上不起作用)

一种尝试的解决方案(如Andrew Thompson所建议)是
this.getClass().getResource( ... )代替Sandbox.class.getResource(…)

import java.io.IOException;
import java.net.URL;

import javax.sound.sampled.*;

public class Sandbox
{

    public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException
    {
        new Sandbox();
    }

    public Sandbox() throws UnsupportedAudioFileException, IOException, LineUnavailableException
    {
        URL url = this.getClass().getResource("/sound-effects/alarmSoundClip.wav");
        AudioInputStream ais = AudioSystem.getAudioInputStream(url);
        AudioFormat af = ais.getFormat();
        DataLine.Info info = new DataLine.Info(Clip.class, af);

        Clip clip = (Clip) AudioSystem.getLine(info);
        clip.open(ais);
        clip.start();
    }
}

问题答案:

Adding
clip.drain()
after clip.start() seems to have worked okay for me (IDE and command line
both with and without &)

import java.io.IOException;
import java.net.URL;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

public class Sandbox {

    public static void main(String[] args)  {
        try {
            URL url = Sandbox.class.getResource("/sound-effects/Loud-alarm-clock-sound.wav");
            AudioInputStream ais = AudioSystem.getAudioInputStream(url);
            AudioFormat af = ais.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, af);

            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(ais);
            clip.start();
            System.out.println("Drain...");
            clip.drain();
            System.out.println("...Drained");
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException exp) {
            exp.printStackTrace();
        }
    }

}

Now, having said that, I have found drain a little unreliable in the past,
especially when there are multiple sounds playing in which case I tend to use
a LineListener

For example…

import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

public class Sandbox {

    protected static final Object LOCK = new Object();

    public static void main(String[] args) {
        try {
            URL url = Sandbox.class.getResource("/sound-effects/Loud-alarm-clock-sound.wav");
            AudioInputStream ais = AudioSystem.getAudioInputStream(url);
            AudioFormat af = ais.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, af);

            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(ais);

            clip.addLineListener(new LineListener() {
                @Override
                public void update(LineEvent event) {
                    System.out.println(event.getType());
                    if (event.getType() == LineEvent.Type.STOP) {
                        synchronized (LOCK) {
                            LOCK.notify();
                        }
                    }
                }
            });
            clip.start();

            synchronized (LOCK) {
                LOCK.wait();
            }
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException | InterruptedException exp) {
            exp.printStackTrace();
        }
    }

}


 类似资料:
  • 问题内容: 我正在寻找一种轻松播放远程 .mp3 文件的解决方案。我看过适用于本地文件的“ pyglet”模块,但似乎无法处理远程文件。我可以临时下载 .mp3 文件,但是由于 .mp3 文件看起来太大,因此不建议这样做。 我宁愿它用于跨平台而不是仅用于Windows等。 例如,播放来自以下位置的音频文件: http://example.com/sound.mp3 只需在下载文件时流式传输文件,我

  • 我尝试建立一个按钮,一旦点击它播放一个音频文件,如果再次点击它停止它。在按钮中,有一个属性src,其中放置了应该播放的文件的路径。 null null 当我尝试单击该按钮时,日志显示“”。但音频已设置,警报显示文件路径在那里。 我做错了什么?

  • 我正在使用媒体播放器播放带有列表视图的原始文件夹中的音频文件。一切正常,但我有一个问题。 问题是:当第一个音频文件结束时,它播放第二个文件,但当第二个文件结束时,它不播放第三个文件。 问题是什么??我尝试在mp上添加setOnCompletionListener并重置mp并在(位置+1)中播放audion,这是真的吗? 我还有一个问题。当它结束播放listview中的第一个项目并开始播放第二个项目

  • 我正在读一本书。wav文件在C中,然后我尝试使用一些QT函数播放音频文件。以下是我如何阅读该文件: 所以我的音频文件在里面。的每个元素都是无符号的16位整数。 为了播放声音,我将每个16位无符号整数分成两个字符,然后每隔3毫秒(使用计时器)向音频卡发送256个字符。假设是256个字符的字符数组,我这样做(每隔3毫秒)来播放声音: 此外,定义为: 并且定义为: 并且音频格式设置正确为: 然而,当我试

  • 函数名称: 播放音频 函数功能: 在后台播放指定的声音文件 函数方法 media.playAudio(path,vol,flag) 参数 类型 必填 说明 path string 是 音频文件名,支持 mp3、m4a、m4r、ogg、wav vol string 否 音频音量,不写默认,使用当前设置的音量 flag string 否 是否循环播放,不写默认为 false - 不循环,true -

  • 有了一个机器人,我试着用discord在一个音频通道中播放一个音频文件(mp3)。js、ffmpeg和opusscript。 基本上,这就是它的工作原理: 因此,音频播放,但在结束前停止(例如,对于5s音频文件,它在3s后停止)。机器人留在频道中,我可以再次播放,但对于我的所有文件,它在结束前停止。我怎样才能解决这个问题?