繁体   English   中英

播放声音出错 java (无线路匹配接口剪辑支持格式)

[英]error playing sound java (No line matching interface Clip supporting format)

我们正在尝试将声音集成到我们的一个项目中,我的团队成员没有收到此错误,而我在两台不同的机器上得到了它。

堆栈跟踪:

Exception in thread "SoundPlayer" java.lang.IllegalArgumentException: No line matching interface Clip supporting format PCM_SIGNED 16000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian, and buffers of 11129272 to 11129272 bytes is supported.
at javax.sound.sampled.AudioSystem.getLine(Unknown Source)  
at sound.Music.run(Music.java:86)  
at java.lang.Thread.run(Unknown Source)

代码:

package sound;

import java.io.File;
import java.io.IOException;

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;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;


public class Music implements LineListener, Runnable
{

private File soundFile;
private Thread thread;
private static Music player;
private Music audio;
private Clip clip;

    public Music()
    {
    }

    public void playSiren(String musicFileName)
    {
        Music p = getPlayer();
        p.playSirenFile(musicFileName);
    }

    private void playSirenFile(String musicFileName)
    {
        this.soundFile = new File("Music/"+musicFileName+".wav");
        thread = new Thread(this);
        thread.setName("SoundPlayer");
        thread.start();
    }

    public void run()
    {
        try
        {
            AudioInputStream stream = AudioSystem.getAudioInputStream(this.soundFile);
            AudioFormat format = stream.getFormat();

/**
* we can't yet open the device for ALAW/ULAW playback, convert
* ALAW/ULAW to PCM
*/
            if ((format.getEncoding() == AudioFormat.Encoding.ULAW) || (format.getEncoding() == AudioFormat.Encoding.ALAW))
            {
                AudioFormat tmp = new AudioFormat(
                AudioFormat.Encoding.PCM_SIGNED,
                format.getSampleRate(),
                format.getSampleSizeInBits() * 2, format.getChannels(),
                format.getFrameSize() * 2, format.getFrameRate(), true);
                stream = AudioSystem.getAudioInputStream(tmp, stream);
                format = tmp;
            }
            DataLine.Info info = new DataLine.Info(Clip.class, stream
            .getFormat(), ((int) stream.getFrameLength() * format
            .getFrameSize()));

            clip = (Clip) AudioSystem.getLine(info);
            clip.addLineListener(this);
            clip.open(stream);
            clip.start();
            try
            {
                thread.sleep(99);
            }
            catch (Exception e)
            {
            }
            while (clip.isActive() && thread != null)
            {
                try
                {
                    thread.sleep(99);
                }
                catch (Exception e)
                {
                    break;
                }
            }
            clip.loop(99999999);
        }
        catch (UnsupportedAudioFileException e)
        {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
        catch (IOException e)
        {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
        catch (LineUnavailableException e)
        {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
    }

    private static Music getPlayer()
    {
        if (player == null)
        {
            player = new Music();
        }
        return player;
    }

    public void update(LineEvent event)
    {
    }

    public void stopClip()
    {
        clip.stop();
    }

    public void closeClip()
    {
        clip.close();
    }

    public void startClip()
    {
        clip.start();
    }
    public void volume(float volume)
    {
        /*
        FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
        gainControl.setValue(-50.0f); // Reduce volume IN DECIBELS
        clip.start();
        */
    }
}

我们从 domainController 调用这个 class

audio = new Music();  
audio.playSiren("stillAliveDecent");

有人知道如何解决此异常吗? 我尝试重新安装我的编辑器软件(Eclipse)但无济于事。

感谢提前分配。

编辑

我们只是尝试切换声音文件。 我们尝试用小得多的文件运行它。 这现在可以工作了,但是一旦我们切换回更大的.wav 文件(10+MB),我就会再次遇到异常。

仅使用较小的文件并不是一个真正的选择,因为我们想使用一些很长的自制歌曲。

编辑 2
我很确定这不是损坏的wav。 我们重新编译了它,甚至使用了另一波类似长度和大小的波,我仍然是唯一一个得到这个错误的人。

一些额外要求的信息:

操作系统:Windows 7 64bit Ultimate
JDK:1.6.0_22

编辑 3

经过一些 wave 创建和播放后,我们得出结论,由于某种原因,我无法播放大于 2MB 的 wave。

仍然为什么我的队友不受此影响?

我在树莓派上遇到了同样的问题。 它会很好地播放前 5 个文件,然后我会收到错误消息。 事实证明,我没有在需要时关闭剪辑。

Clip clip = AudioSystem.getClip();
clip.addLineListener(event -> {
    if(LineEvent.Type.STOP.equals(event.getType())) {
        clip.close();
    }
});
ByteArrayInputStream audioBytes = new ByteArrayInputStream(SOUNDS.get(file));
AudioInputStream inputStream = AudioSystem.getAudioInputStream(audioBytes);
clip.open(inputStream);
clip.start();

添加线路侦听器并在停止时关闭剪辑后,错误消失了。

如果需要,您实际上可以播放 40 mb 以上的声音,这就是我走了多远:p,问题主要是 eclipse,更确切地说,它在您的工作区中的 the.metadata 文件夹,我认为它就像一个只上传的小插件一半的时间,所以问题出在您的编辑器而不是代码上,上面的代码运行良好,因为我可以毫无问题地播放歌曲。 确保您的路径正确,并尝试获取正确版本的.metadata,您应该没问题。 我的一个朋友遇到了同样的问题,我给了他我的工作区和元数据副本,它运行良好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM