1

プログラムにサウンドを追加しようとしています。プログラムにサウンドを追加する方法はありません。私はこれを試していますが、このコードは例外「null」を与えます。playSound関数で渡さなければならない引数がわかりません。助けてください。

import java.io.InputStream;
import sun.audio.*; //import the sun.audio package
import java.io.*;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public class Main {

    public Main() {

    }

    public static void main(String[] args) {
        System.out.println("hello there");
        playSound("Hi there");

    }

    public static synchronized void playSound(final String url) {
        new Thread(new Runnable() { // the wrapper thread is unnecessary, unless
                                    // it blocks on the Clip finishing, see
                                    // comments
                    public void run() {
                        try {
                            Clip clip = AudioSystem.getClip();
                            AudioInputStream inputStream = AudioSystem
                                    .getAudioInputStream(Main.class
                                            .getResourceAsStream("pacman_chomp.wav"
                                                    + url));
                            clip.open(inputStream);
                            clip.start();
                        } catch (Exception e) {
                            System.err.println(e.getMessage());
                        }
                    }
                }).start();
    }

}
4

4 に答える 4

1

ファイルが見つからないため、null 例外が発生している可能性があります。現時点では、次のファイルを探しています。

「pacman_chomp.wavこんにちは」

url の値が「こんにちは」に設定されており、次のように作成しているためです。

AudioInputStream inputStream = AudioSystem
                                    .getAudioInputStream(Main.class
                                            .getResourceAsStream("pacman_chomp.wav"
                                                    + url));

ファイル ""pacman_chomp.wav" が必要だと思いますか? その場合は "+ url" を削除してください。

于 2012-10-02T15:08:32.777 に答える
1

playSound メソッドが機能しないとおっしゃっていたので、ここに私がコード化したサウンド クラスを示します。

import java.io.IOException;
import java.io.InputStream;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;

public class AePlayWave extends Thread {

    protected static final boolean DEBUG = false;

    protected InputStream inputStream;

    public AePlayWave(InputStream inputStream) {
        this.inputStream = inputStream;
        if (DEBUG) System.out.println("AePlayWave constructor");
    }

    @Override
    public void run() {
        if (DEBUG) System.out.println("AePlayWave running");

        AudioInputStream audioInputStream = verifyInputStream();
        if (audioInputStream == null) {
            return;
        }

        AudioFormat format = audioInputStream.getFormat();
        SourceDataLine audioLine = openInputStream(format);

        if (DEBUG) System.out.println(audioLine.getLineInfo());

        if (audioLine != null) {
            audioLine.start();
            playInputStream(audioInputStream, audioLine);
        }
    }

    protected AudioInputStream verifyInputStream() {
        if (DEBUG) System.out.println("AePlayWave verifyInputStream");
        AudioInputStream audioInputStream = null;
        try {
            audioInputStream = AudioSystem.getAudioInputStream(inputStream);
        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        return audioInputStream;
    }

    protected SourceDataLine openInputStream(AudioFormat format) {
        if (DEBUG) System.out.println("AePlayWave openInputStream");
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
        SourceDataLine audioLine = null;
        if (DEBUG) System.out.println("AePlayWave openInputStream try");
        try {
            audioLine = (SourceDataLine) AudioSystem.getLine(info);
            if (DEBUG) System.out.println("AePlayWave openInputStream getLine");
            audioLine.open(format);
            if (DEBUG) System.out.println("AePlayWave openInputStream open");
        } catch (LineUnavailableException e) {
            e.printStackTrace();
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return audioLine;
    }

    protected void playInputStream(AudioInputStream audioInputStream,
            SourceDataLine audioLine) {
        if (DEBUG) System.out.println("AePlayWave playInputStream");
        int externalBufferSize = (int) audioInputStream.getFrameLength() * 4;
        if (DEBUG) System.out.println("AePlayWave playInputStream externalBufferSize: " 
                + externalBufferSize);
        int nBytesRead = 0;
        byte[] abData = new byte[externalBufferSize];

        try {
            while (nBytesRead != -1) {
                nBytesRead = audioInputStream.read(abData, 0, abData.length);
                if (nBytesRead >= 0) {
                    if (DEBUG) System.out.println("Bytes read: " + nBytesRead);
                    audioLine.write(abData, 0, nBytesRead);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            return;
        } finally {
            audioLine.drain();
            audioLine.close();
        }
    }
}

そして、これがどのように呼び出されるかです:

InputStream inputStream = getClass().getResourceAsStream("alarm-clock-1.wav");
AePlayWave playWave = new AePlayWave(inputStream);
playWave.run();
于 2012-10-02T15:12:37.183 に答える
0
playSound("pacman_chomp.wav");


public static synchronized void playSound(final String url) {
    new Thread(new Runnable() { // the wrapper thread is unnecessary, unless
                                // it blocks on the Clip finishing, see
                                // comments
                public void run() {
                    try {
                        Clip clip = AudioSystem.getClip();
                        AudioInputStream inputStream = AudioSystem
                                .getAudioInputStream(Main.class
                                        .getResourceAsStream(url));
                        clip.open(inputStream);
                        clip.start();
                    } catch (Exception e) {
                        System.err.println(e.getMessage());
                    }
                }
            }).start();
}

a: 上で述べたように、「pacman_chomp.wavHi there」を探します。

b: ここではハードコーディングは推奨されません。コードを再利用できなくなります。例として、playSound メソッドでハードコーディングした場合、これを行うことはできません。

    playSound("pacman_chomp.wav");
    playSound("pacman_dies.wav");

さらに、メソッド名 "playSound" は (ハードコードされたファイルでは) 不適切な名前になります。これは、常に pacman_chomp ファイルを再生するためです (正しく指定されている場合)。

c: とにかく「こんにちは」の目的は何ですか?

于 2012-10-02T16:17:37.923 に答える
0

クリップは長いオーディオ ファイルを許可しません。私のゲーム エンジンからのこれらのクラスを参照してください。

SoundState WavPlayer WavSound

次に、このコードを使用します。

// First load the sound
WavSound snd = WavPlayer.loadSound("pacman_chomp.wav");
// play it then
snd.play();

これらのクラスは無料で使用できます。彼らが助けてくれることを願っています。

于 2012-10-02T15:03:39.840 に答える