ошибка при воспроизведении звука в формате java (отсутствует интерфейс соответствия строк в формате, поддерживающем клип) - PullRequest
4 голосов
/ 27 апреля 2011

Мы пытаемся интегрировать звук в один из наших проектов, члены моей команды не получают эту ошибку, а я получаю ее на двух разных машинах.

Трассировка стека:

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 с помощью

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

Кто-нибудь имеет представление, как это исключение можетрешаться?Я попытался переустановить программное обеспечение моего редактора (Eclipse), но безрезультатно.

заранее спасибо большое.

Редактировать

Мы только что попробовали переключить звукфайл.Мы попытались запустить его с гораздо меньшим файлом.теперь это работает, но как только мы вернемся к большему WAV-файлу (10 + МБ), я снова получу исключение.

Только использование меньших файлов - не вариант, так как мы хотели бы использовать некоторые самостоятельно сделанныепесни довольно длинные.

Edit 2
Я уверен, что это не испорченный wav.мы перекомпилировали его, даже использовали другую волну аналогичной длины и размера, и я до сих пор единственная, кто получает эту ошибку.

некоторая дополнительная запрошенная информация:

ОС: Windows 7 64bit Ultimate
JDK: 1.6.0_22

Редактировать 3

После создания и воспроизведения волны мы пришли к выводу, что по какой-то причине я не могу играть большечем 2 МБ.

И все же, почему это не влияет на моих товарищей по команде?

Ответы [ 2 ]

1 голос
/ 14 января 2017

У меня была такая же проблема на малиновом пи.Он будет воспроизводить первые 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();

После добавления слушателя строки и закрытия клипа, когда он остановился, ошибки исчезли.

1 голос
/ 28 апреля 2011

На самом деле вы можете воспроизводить звук размером более 40 Мб, если нужно, вот как далеко я зашёл: p, проблема в основном затмение, а если быть точным, это папка .metadata в вашем рабочем пространстве, я думаю, что это маленький плагин, который загружается только половину времени, так что проблема заключается в вашем редакторе, а не в коде, код выше работает отлично, так как я мог играть песни без каких-либо проблем. Убедитесь, что ваши пути верны, и попробуйте получить правильную версию .metadata, и все будет в порядке. У моего друга была такая же проблема, и я дал ему свою копию рабочего пространства и .metadata, и она отлично работала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...