0

修正できない非常に奇妙な問題があります。

私は現在ゲームを作っていて、ゲームにサウンドが必要です。これはjarファイルとして実行されることになっており、Eclipseから実行するとゲームは完全に正常に動作します.

SoundPlayer は、ゲームで使用する外部 jar ライブラリの一部です。次に、名前とフォルダーを受け取り、サウンドを再生します。サウンドは、FTSound オブジェクト クラスがあるフォルダーのサブフォルダーにあります。jar ファイルを確認したところ、サウンド ファイルが含まれており、Eclipse と同じ場所にあります。今私が遭遇した奇妙な問題に:

jar ファイルをダブルクリックして実行すると、サウンド以外はすべて機能します。完全に欠落しています。ただし、cmd を使用して jar を起動すると、サウンドは正常に機能します。まったく同じ壷です。

何か案は?あなたの助けに感謝します!

サウンドは次のコードで再生されます。

public static void playSound(final FTSound sound) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try{
                Clip clip = AudioSystem.getClip();
                AudioInputStream inputStream = AudioSystem.getAudioInputStream(sound.getClass().getResource(sound.getFolderName() + "/" + sound.getSoundName()));
                clip.open(inputStream);
                clip.start(); 
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
}
4

1 に答える 1

0

いくつかのアイデアが思い浮かびます。あなたは日食を使用していると言いました。ファイルを .jar に抽出するときは、オーディオ ファイルがすべて同じ場所に抽出されていることを確認してください。サウンド ファイルを含むディレクトリの外にある .jar をクリックし、それがショートカットではなく、cmd の同じディレクトリ内で実行する場合、説明した問題が発生する可能性があります。問題を実際に解決するわけではありませんが、私が提案する回避策は、コマンド プロンプトでゲームを開始するためのバットを作成することです。これにより、サウンドも再生するクリック可能なファイルが得られます。コードに問題は見当たりません。サウンドが再生された場合は、おそらく問題はありません。もう 1 つ: クリップ オブジェクトは、数秒以上サウンドを再生できません。効果音を探しているなら、それは素晴らしいです、

new Thread(new Runnable()
{
    SourceDataLine soundLine;
    public void run()
    {
      soundLine = null;
          int BUFFER_SIZE = 64*1024;  // 64 KB

              // Set up an audio input stream piped from the sound file.
              try {
                 AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(this.getClass().getResource("title.wav"));
                 AudioFormat audioFormat = audioInputStream.getFormat();
                 DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
                 soundLine = (SourceDataLine) AudioSystem.getLine(info);
                 soundLine.open(audioFormat);
                 soundLine.start();
                 int nBytesRead = 0;
                 byte[] sampledData = new byte[BUFFER_SIZE];
                 while (nBytesRead != -1) 
                 {
                    nBytesRead = audioInputStream.read(sampledData, 0, sampledData.length);
                    if (nBytesRead >= 0) 
                    {
                       // Writes audio data to the mixer via this source data line.
                       soundLine.write(sampledData, 0, nBytesRead);
                    }

                 }
              } catch (Exception ex) 
              {
                 ex.printStackTrace();
              }finally 
              {
                 soundLine.drain();
                 soundLine.close();
              }
        }
}).start();
于 2013-05-24T22:06:33.897 に答える