Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java桌面应用程序中播放声音_Java_Audio - Fatal编程技术网

在Java桌面应用程序中播放声音

在Java桌面应用程序中播放声音,java,audio,Java,Audio,如何在Java桌面应用程序中播放声音(任何格式的音乐文件,如.wma、.mp3)?(不是小程序) 我使用了以下代码(取自关于堆栈溢出的另一个问题),但它引发了一个异常 public class playsound { public static void main(String[] args) { s s=new s(); s.start(); } } class s extends Thread{ public void run(){ try{

如何在Java桌面应用程序中播放声音(任何格式的音乐文件,如.wma、.mp3)?(不是小程序)

我使用了以下代码(取自关于堆栈溢出的另一个问题),但它引发了一个异常

public class playsound {
    public static void main(String[] args) {
s s=new s();
s.start();
    }
}
class s extends Thread{
    public void run(){
        try{
            InputStream in = new FileInputStream("C:\\Users\\srgf\\Desktop\\s.wma");
         AudioStream as =    new AudioStream(in); //line 26
            AudioPlayer.player.start(as);
        }
        catch(Exception e){
            e.printStackTrace();
            System.exit(1);
        }
    }
}
运行时程序会引发以下异常:

java.io.IOException: could not create audio stream from input stream
    at sun.audio.AudioStream.<init>(AudioStream.java:82)
    at s.run(delplaysound.java:26)
java.io.IOException:无法从输入流创建音频流
在sun.audio.AudioStream.(AudioStream.java:82)
在s.run(delplaysound.java:26)
使用此库:


希望这能帮助大家解决一个类似的问题:-)

嗯。这可能看起来像是我的东西的广告,但你可以在这里使用我的API:

用这个播放很容易

备选方案:使用Java片段(预缓冲)

那么你需要这个方法:

public static AudioInputStream getSupportedAudioInputStreamFromInputStream(InputStream pInputStream) throws UnsupportedAudioFileException,
        IOException {
    AudioInputStream sourceAudioInputStream = AudioSystem
            .getAudioInputStream(pInputStream);
    AudioInputStream ret = sourceAudioInputStream;
    AudioFormat sourceAudioFormat = sourceAudioInputStream.getFormat();
    DataLine.Info supportInfo = new DataLine.Info(SourceDataLine.class,
            sourceAudioFormat,
            AudioSystem.NOT_SPECIFIED);
    boolean directSupport = AudioSystem.isLineSupported(supportInfo);
    if(!directSupport) {
        float sampleRate = sourceAudioFormat.getSampleRate();
        int channels = sourceAudioFormat.getChannels();
        AudioFormat newFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                sampleRate,
                16,
                channels,
                channels * 2,
                sampleRate,
                false);
        AudioInputStream convertedAudioInputStream = AudioSystem
                .getAudioInputStream(newFormat, sourceAudioInputStream);
        sourceAudioFormat = newFormat;
        ret = convertedAudioInputStream;
    }
    return ret;
}
剪辑示例的来源(我几乎没有做任何更改):

SPI是通过将它们的.jar添加到类路径来添加的

对于mp3,这些是:

  • (tritonus_share.jar)
使用JavaFX(与JDK捆绑在一起)非常简单。 您将需要以下导入:

import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.util.Duration;

import java.nio.file.Paths;

步骤:

初始化JavaFX:

new JFXPanel();
创建
媒体
(声音):

创建一个
MediaPlayer
来播放声音:

MediaPlayer player = new MediaPlayer(media);
并播放
媒体

player.play();
您还可以使用
MediaPlayer.setStartTime()
MediaPlayer.setStopTime()设置开始/停止时间:

或者,您可以停止使用
MediaPlayer.stop()

播放音频的示例函数:

public static void playAudio(String name, double startMillis, double stopMillis) {
    Media media = new Media(Paths.get(name).toUri().toString());
    MediaPlayer player = new MediaPlayer(media);

    player.setStartTime(new Duration(startMillis));
    player.setStopTime(new Duration(stopMillis));
    player.play();
}

更多信息可在JavaFX上找到。

检查。我知道它提到了mp3不受JAVA支持,但可能与。wma认为windows不是很好。上面的代码也可以播放硬盘上的文件吗?这对我不起作用。我在线程的run()方法中包含了上面的代码,在语句mp3player.play()之后,我包含了语句sleep(10000);以便音频完成播放。是的,请参见此示例
MediaPlayer player = new MediaPlayer(media);
player.play();
player.setStartTime(new Duration(Duration.ZERO)); // Start at the beginning of the sound file
player.setStopTime(1000); // Stop one second (1000 milliseconds) into the playback
public static void playAudio(String name, double startMillis, double stopMillis) {
    Media media = new Media(Paths.get(name).toUri().toString());
    MediaPlayer player = new MediaPlayer(media);

    player.setStartTime(new Duration(startMillis));
    player.setStopTime(new Duration(stopMillis));
    player.play();
}