【问题标题】:Sound with java does not play? Even 16 or 8 bits?用java的声音不播放?甚至是 16 位还是 8 位?
【发布时间】:2017-05-01 01:57:57
【问题描述】:

您好,我的问题是我无法让我的程序播放声音,虽然我不知道我做错了什么,但我遵循了几个视频的指南,到目前为止我不知道该怎么做。我什至将我的文件转换为 .wav 和 8 位或 16 位,所以我知道这不是文件,因为 java 支持它。

这里是代码和错误信息:

import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.ThreadPoolExecutor;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;

public class MusicPlayer implements Runnable {

    private ArrayList<String> musicFiles;
    private int currentSongIndex;

    public MusicPlayer(String...files){

        musicFiles = new ArrayList<String>();


        for(String file : files){

            musicFiles.add("./Music Player/src" + file + ".wav");




        }


    }

    private void playSound(String fileName){

        try{

            File soundFile = new File(fileName);
            AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile);
            AudioFormat format = ais.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, format);

            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(ais);
            FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);

            gainControl.setValue(-10);
            clip.start();

        }catch(Exception e){

            e.printStackTrace();


        }


    }

    public static void main(String[] args) {

//      ThreadPoolExecutor pool = new ThreadPoolExecutor(2);
        MusicPlayer music = new MusicPlayer("Chillout");

        music.playSound("./Music Player/src/Chillout.wav");

    }


    @Override
    public void run() {

        playSound(musicFiles.get(currentSongIndex));


    }

}

错误信息:

java.io.FileNotFoundException: .\Music Player\src\Chillout.wav (The system cannot find the path specified)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at com.sun.media.sound.WaveFloatFileReader.getAudioInputStream(Unknown Source)
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
    at MusicPlayer.playSound(MusicPlayer.java:39)
    at MusicPlayer.main(MusicPlayer.java:65)

不明白,我用scr和项目文件夹中的文件试过了,还是找不到文件?

谢谢

【问题讨论】:

  • 不要在你的代码中引用src,一旦应用程序被构建/发布,它就不会存在。而是使用Class#getResource 来加载嵌入式资源 - 另外,不要将嵌入式资源视为“文件”,它们不是,大多数 API 都支持 URLInputStream
  • 您的问题只是文件夹问题。把你的路径没有空格字符和主目录的基础。例如 /home/emir/Music/myfile.wav
  • 不,这不是路径的问题,我尝试了 URL 方式并不起作用,我尝试了 inputStream 也不起作用。似乎所有关于这方面的教程都很糟糕,因为我一遍又一遍地遇到同样的问题,而且当它没有给我错误时,绝对没有声音播放!
  • “我尝试了URL方式,但不起作用”什么URL?你试过music.playSound("c:\test\Chillout.wav");之类的吗? (显然要确保存在一个名为“test”的文件夹,其中包含 .wav 文件).... 也关于 “绝对没有声音播放!” 未经测试,但我想知道 gainControl.setValue(-10); 是否减少了太多(你听不到零音量)

标签: java audio file-io wav


【解决方案1】:

我将在上面引用我自己的评论,它简单描述了我是如何解决问题的。现在网上很多人都在为此寻找解决方案,大多数答案和视频都非常令人失望,因为我搜索了一个小时的体面且有效的东西。

如果您正在寻找解决此问题的简单方法,请尽情享受;)。

我只是通过更改文件夹地址和 将对象音乐播放器实例化到 run 方法中,这 是有道理的,因为您需要通过 传递字符串的构造函数,gainControl,无关 用它,因为它只是供以后使用的东西。谢谢你虽然我 我会发布解决方案。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.ThreadPoolExecutor;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;

public class MusicPlayer implements Runnable {

    private ArrayList<String> musicFiles;

    public MusicPlayer(String...files){

        musicFiles = new ArrayList<String>();


        for(String file : files){

            musicFiles.add("C:"fullpath"/Music Player/src/" + file + ".wav");

        }


    }

    private void playSound(String fileName){

        try{

            File soundFile = new File(fileName);
            AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile);
            AudioFormat format = ais.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, format);

            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(ais);
            FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);

            gainControl.setValue(-10);
            clip.start();

        }catch(Exception e){

            e.printStackTrace();



        }
    }

    @Override
    public void run() {

        MusicPlayer music = new MusicPlayer("Chillout");
        music.playSound("C:"fullpath"/Music/Chillout.wav");

    }


}

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多