0

さて、タイトルがすべてを物語っていますが、javax.sound を使用して wav ファイルを再生しようとしましたが、何も起こりません。運が悪くても、さまざまなファイルを試しました。

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

    File in = new File("C:\\Users\\Sandra\\Desktop\\music\\rags.wav");
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in);
    Clip play = AudioSystem.getClip();
    play.open(audioInputStream);
    FloatControl volume= (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN);
    volume.setValue(1.0f); // Reduce volume by 10 decibels.
    play.start();

}
4

6 に答える 6

8

すでに述べたように、メイン スレッドが終了しないようにする必要があります。終了すると JVM が終了します。

Clip#startブロッキング呼び出しではありません。つまり、呼び出された後 (すぐに) 戻ります。

この問題に取り組むには多くの方法があることに疑いの余地はなく、これはそのうちの 1 つの単純な例にすぎません。

public class PlayMusic {

    public static void main(String[] args) throws InterruptedException {
        Clip play = null;
        try {
            File in = new File("C:\\Users\\Public\\Music\\Sample Music\\Kalimba.wav");
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in);
            play = AudioSystem.getClip();
            play.open(audioInputStream);
            FloatControl volume = (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN);
            volume.setValue(1.0f); // Reduce volume by 10 decibels.
            play.start();
            // Loop until the Clip is not longer running.
            // We loop this way to allow the line to fill, otherwise isRunning will
            // return false
            //do {
            //    Thread.sleep(15);
            //} while (play.isRunning());
            play.drain();
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
            ex.printStackTrace();
        } finally {
            try {
                play.close();
            } catch (Exception exp) {
            }
        }
        System.out.println("...");
    }
}

実際のソリューションは、ニーズによって異なります。

于 2013-06-17T00:38:30.510 に答える
4

Java のサウンドでは、オーディオ入力ファイルを再生Clipするためにアクティブが必要Threadです。そうしないと、ファイルを再生する前にアプリケーションが終了します。追加できます

JOptionPane.showMessageDialog(null, "Click OK to stop music");

電話した後start

于 2013-06-16T23:31:41.050 に答える
4

オーディオ クリップを再生する適切な方法は、オーディオの再生で説明されているように、ラインをドレインすることです。

したがって、メインは次のようになります。

public static void main(String[] args) throws IOException,
    UnsupportedAudioFileException, LineUnavailableException
{
    File in = new File("C:\\Users\\Sandra\\Desktop\\music\\rags.wav");
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in);
    Clip play = AudioSystem.getClip();
    play.open(audioInputStream);
    FloatControl volume= (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN);
    volume.setValue(1.0f); // Reduce volume by 10 decibels.
    play.start();
    play.drain();
    play.close();
}

play.drain()すべてのデータが再生されるまでブロックします。

于 2014-05-12T05:18:51.180 に答える
2

ここではクリップを再生しています

    public static void main(String[] args) throws Exception {
           File in = new File("C:\\Users\\Sandra\\Desktop\\music\\rags.wav");
           AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in);
           Clip play = AudioSystem.getClip();
           play.open(audioInputStream);
           FloatControl volume= (FloatControl)play.getControl(FloatControl.Type.MASTER_GAIN);
           volume.setValue(1.0f); // Reduce volume by 10 decibels.
           play.start();
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    // A GUI element to prevent the Clip's daemon Thread
                    // from terminating at the end of the main()
                    JOptionPane.showMessageDialog(null, "Close to exit!");
                }
            });
        }
于 2013-06-16T23:47:02.213 に答える
1

サウンドが再生される前に、プログラムが終了しています。私はplay.start();いくつかのスレッド化方法 ( invokeLater、...) で行い、サウンドが終了するまで待機する方法も見つけます (Reimeus が提案した方法)。

リード :

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {

          ...

          play.start();
          JOptionPane.showMessageDialog(null, "Click OK to stop music");
        }
    });

}
于 2013-06-16T23:31:47.697 に答える
0

オーディオを再生するだけの場合は、次の方法があります。

String 変数には、オーディオ ファイルへの正しいパスが必要です。audioFileDirectoryそうしないと、例外がスローされ、プログラムが実行されません。

IDE を使用している場合に、プロジェクトに適切なオーディオ ファイル ディレクトリがある例:

  1. フォルダー内にsrcフォルダーを作成します (例: "music")。そこにオーディオ ファイルを配置します。
  2. audioFileDirectory = "/music/name_of_audio_file";

オーディオを再生するための重要な部分は、プログラムのメインスレッドが何らかの形で「生きている」必要があるということです。

Thread.sleep(audio.getMicrosecondLength()/1000);

メインスレッドが「生きている」場所であり、引数audio.getMicrosecondLength()/1000は「生きている」時間であり、オーディオファイルの全長です。

public class AudioTest
{
    void playAudio() throws Exception
    {
        String audioFileDirectory = "your_audioFileDirectory";
        InputStream is = getClass().getResourceAsStream(audioFileDirectory);
        BufferedInputStream bis = new BufferedInputStream(is);
        AudioInputStream ais = AudioSystem.getAudioInputStream(bis);
        Clip audio = AudioSystem.getClip();
        audio.open(ais);
        audio.loop(Clip.LOOP_CONTINUOUSLY);
        audio.start();
        Thread.sleep(audio.getMicrosecondLength()/1000);
        audio.close();
    } // end playAudio

    public static void main(String[] args) 
    {
        try 
        {
            new AudioTest().playAudio();
        } 
        catch (Exception e) 
        {
            System.out.println("Class: " + e.getClass().getName());
            System.out.println("\nMessage:\n" + e.getMessage() + "\n");
            e.printStackTrace();
        }
    } // end main
} // end class AudioTest
于 2019-09-26T03:00:06.320 に答える