Не удалось создать объект AudioData?

У меня проблема с моим кодом, когда каждый раз, когда я запускаю проект, это выбрасывается. Теперь я сузил его до того, что звук воспроизводится, когда я вызываю метод play(), но не воспроизводится, когда я вызываю метод playL().

package net.chrypthic.Ball;
import sun.audio.*;
import java.io.*;

public class SoundManager {

AudioPlayer ap = AudioPlayer.player;
AudioStream as;
ContinuousAudioDataStream loop = null;
public SoundManager(String music)
{
    try
    {
        InputStream input = new FileInputStream("./"+music);
        as = new AudioStream(input);
        AudioData ad = as.getData();
        loop = new ContinuousAudioDataStream(ad);
    }catch(Exception e)
    {
        System.out.println(e.getMessage());
    }
}
public void play()
{
    ap.start(as);
}
public void stop()
{
    ap.start(as);
}
public void playL()
{
    ap.start(loop);
}
public void stopL()
{
    ap.start(loop);
}
}

Почему? Я передаю ему файл sound/gsong1b.wav, который имеет размер 6,2 МБ, длится 2 минуты и имеет битрейт 16000 Гц. Я слышал, что звуки должны быть размером менее 4 МБ, но они воспроизводятся, и только ошибки, когда я зацикливаюсь ... Любая помощь будет принята с благодарностью.


person chrypthic    schedule 06.10.2011    source источник
comment
Есть ли кто-нибудь, кто может решить эту проблему?   -  person chrypthic    schedule 06.10.2011


Ответы (3)


Те классы, которые вы используете (AudioPlayer, AudioStream), хотя они и взяты из официального Java JDK, на самом деле являются зарезервированными классами, а это означает, что Oracle (а до них Sun) оставляет за собой право изменять их без предварительного уведомления. Вместо этого вы должны использовать официальный звуковой API:

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

//...

public static void main(String[] args) throws Throwable {
        Clip clip = AudioSystem.getClip();
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(SoundManager.class.getResourceAsStream("C://temp/my.mp3"));
        clip.open(inputStream);
        clip.start(); 
    }
person Shivan Dragon    schedule 06.10.2011
comment
Спасибо за быстрый ответ, теперь он выдает javax.sound.sampled.LineUnavailableException: не удалось выделить данные клипа: запрошенный буфер слишком велик. Любые идеи? - person chrypthic; 06.10.2011
comment
Должен ли я изменить размер буфера, и если как мне это сделать? - person chrypthic; 06.10.2011
comment
Боюсь, это тоже своего рода загадка для меня. Это может быть из-за драйверов вашей звуковой карты, попробуйте обновить их, или это может быть ваш звуковой файл, который не подходит для Java. Если последнее, боюсь, вы сами по себе, попробуйте немного погуглить... - person Shivan Dragon; 06.10.2011
comment
Что ж, спасибо. Я думаю, что я просто сделаю свой звук 4-минутным и добавим таймер на уровень (это игра). - person chrypthic; 07.10.2011

Вместо этого попробуйте использовать HeadspaceMixer. javax.sound не является завершенной реализацией.

person Marc    schedule 06.10.2011

Используя IDE, перейдите к действию, выполненному методом вашей звуковой кнопки. Для непрерывного воспроизведения файлов .wav. Я использую следующий код, и он отлично работает с использованием потока. Убедитесь, что вы импортируете следующие файлы. импортировать sun.audio.; и импортируйте java.io.;

        Thread sound;
        sound = new Thread(){

           public void run(){

             AudioPlayer MGP=AudioPlayer.player;
             AudioStream BGM;
             AudioData MD;
             ContinuousAudioDataStream loop=null;
  for(;;){

        try{ 
         BGM=new AudioStream(new FileInputStream("C:\\Users\\HAMMED\\01FATIHA         (New).wav"));//enter the sound directory and name here
         AudioPlayer.player.start(BGM);

         //MD=BGM.getData();//not necessary
         //loop=new ContinuousAudioDataStream(MD);//not necessarry

        sleep(48000);// enter the elapse time of ur sond to avoid noise
    }catch(Exception e){

       JOptionPane.showMessageDialog(null, e);
    }


    MGP.start(loop);// It does nothing.I was trying to use this but no success.
        }
     }
  };
    sound.start();        
person Hammed Taofeek    schedule 11.06.2013