1

良い一日!

私はゲームをしていますが、バックグラウンド サウンドが必要です。そのためのクラスを作成し、メインで呼び出します。私のコードは次のとおりです。

import sun.audio.*;
import java.io.*;

    public class Sound {

        public void music() {

            AudioStream backgroundMusic;
            AudioData musicData;
            AudioPlayer musicPlayer = AudioPlayer.player;
            ContinuousAudioDataStream loop = null;
            try {
                backgroundMusic = new AudioStream(new FileInputStream("chickendance.wav"));
                musicData = backgroundMusic.getData();
                loop = new ContinuousAudioDataStream(musicData);
                musicPlayer.start(loop);
            } catch (IOException error) { System.out.println(error);
            }
        }
    }

これは、私が呼び出すメインクラスです。

public class HangmanLauncher extends javax.swing.JFrame {

        public HangmanLauncher() {
            initComponents();
            Sound sound = new Sound();
            sound.music();
        }

私の問題は、音楽が再生されないことです。Error: java.io.IOException: could not create audio stream from input stream.どういう意味ですか?ファイルの種類は Microsoft Wave Sound Format で、サイズは 796kb です。私が間違っていることを知ってもいいですか?あなたの提案は高く評価されます。前もって感謝します。

4

8 に答える 8

3

次のコードを使用して .wav ファイルを再生できます。

JFrame を使用している場合は、他の操作を続行できるように、サウンド ファイルをスレッドで再生する必要があることに注意してください。

import javax.sound.sampled.*;
import java.io.*;
import javax.swing.*;

AudioInputStream as1 = AudioSystem.getAudioInputStream(new java.io.FileInputStream("chickenDance.wav"));
               AudioFormat af = as1.getFormat();
               Clip clip1 = AudioSystem.getClip();
               DataLine.Info info = new DataLine.Info(Clip.class, af);

               Line line1 = AudioSystem.getLine(info);

               if ( ! line1.isOpen() )
               {
                clip1.open(as1);
                clip1.loop(Clip.LOOP_CONTINUOUSLY);
                clip1.start();
               }
于 2011-02-02T16:13:41.653 に答える
3

だから私はこれを自分でやろうとしていて、最終的にそれを実装する方法を見つけましたこの特定のコードは、指定されたディレクトリからランダムにトラックを選択し、別のランダムファイルを選択してループしますrun() メソッド。これは別のスレッドであるため、プログラムの実行は停止しません。

import java.io.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
/**
 *
 * @author Mangusbrother
 */

public class MusicPlayer extends Thread {private AudioStream as;
private AudioPlayer p;
private boolean playback;

public void run() {
    startPlayback();
}

private void setRandom() {
    File[] files = getTracks();
    try {
        String f = files[(int) (Math.random() * (files.length - 1))].getAbsolutePath();
        System.out.println("Now Playing: " + f);
        as = new AudioStream(new FileInputStream(f));
    } catch (IOException ex) {
        Logger.getLogger(MusicPlayer.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void startPlayback() {
    playback = true;
    setRandom();
    p.player.start(as);
    try {
        do {
        } while (as.available() > 0 && playback);
        if (playback) {
            startPlayback();
        }
    } catch (IOException ex) {
        Logger.getLogger(MusicPlayer.class.getName()).log(Level.SEVERE, null, ex);
    }

}

public void stopPlayback() {
    playback = false;
    p.player.stop(as);
}

private File[] getTracks() {
    File dir = new File(System.getProperty("user.dir") + "\\music");
    File[] a = dir.listFiles();
    ArrayList<File> list = new ArrayList<File>();
    for (File f : a) {
        if (f.getName().substring(f.getName().length() - 3, f.getName().length()).equals("wav")) {
            list.add(f);
        }
    }
    File[] ret = new File[list.size()];
    for (int i = 0; i < list.size(); i++) {
        ret[i] = list.get(i);
    }
    return ret;
}

}

于 2012-04-02T12:30:07.873 に答える
2

これはmp3のみだと思いますが、それがオプションの場合は、JLayerとその仲間たちをチェックしてください:http ://www.javazoom.net/projects.html

于 2011-02-02T13:42:55.323 に答える
2

私の推測では、wavファイルはAudioStreamクラスが理解できない形式でエンコードされています。クラスのドキュメントが見つかりませんでした (??) が、そうでない別のファイルを試してみますMicrosoft Wave Sound。繰り返しになりますが、そのエンコーディングの詳細はわかりませんが、Microsoft であるため、おそらく独自仕様であり、Sun のAudioStream.

于 2011-02-02T14:06:34.390 に答える
2

次のように、Wave から AudioInputStream を生成します。

AudioSystem.getAudioInputStream(new FileInputStream("chickendance.wav"));

私はそれを再生しません。

于 2011-02-02T13:55:34.507 に答える
0

上記のヘルプと他のいくつかの情報をありがとう、私は動作するこのコードを持っています:

public void play(InputStream inputStream) {
    try {
        AudioInputStream soundIn = AudioSystem.getAudioInputStream(new BufferedInputStream(inputStream) );
        AudioFormat format = soundIn.getFormat();
        DataLine.Info info = new DataLine.Info(Clip.class, format);

        Clip clip = (Clip) AudioSystem.getLine(info);
        clip.open(soundIn);
        clip.start();
        sleep(clip.getMicrosecondLength() / 1000);// Thread.yield();
    } catch (Exception e) {
        log.warn("could not play");
        e.printStackTrace();
    }
}

private void sleep(long sleep) {
    try {
        Thread.sleep(sleep);
    } catch (InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
}
于 2016-06-30T20:12:52.127 に答える
0

私はオーディオを再生するさまざまな方法を試しましたが、これが最も成功したクラス ファイルであることがわかりました。

package Classes;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import sun.audio.AudioData;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;
public class SoundLoader2 implements Runnable{
    public AudioPlayer Player = AudioPlayer.player;
    public AudioStream Stream = null;
    public AudioData data=null;
    InputStream inputStream=null;
    InputStream inputStream2=null;
    InputStream Stream2=null;
    public ContinuousAudioDataStream loop;
    public String url;
    public URL Url;
    public boolean repeat;
    public SoundLoader2(String url,boolean repeat)throws IOException{
    this.repeat=repeat;
    Url=getClass().getResource(url);
     inputStream = Url.openStream();
     inputStream2 = Url.openStream();
        Stream=new AudioStream(inputStream);
        data=Stream.getData();
        loop = new ContinuousAudioDataStream(data);
        Stream2=new AudioStream(inputStream2);
    }
    public void play(){
    if(this.repeat==true){
        Player.start(loop);
        }
        else if(this.repeat==false);
        Player.start(Stream2);
        }
    @Override
    public void run() {
      play();
    }
    public static void main(String args[]){
    }
}
于 2015-04-13T02:22:03.290 に答える
0

私は.auファイル形式を使用しましたが、うまくいきました。:)

于 2011-02-02T15:52:27.133 に答える