tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
866
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    flofank flofank ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    5
    Hi Leute

    Für ein kleines Programm das ich zur Zeit zu programmieren versuche habe ich mir folgende SoundMachine-Klasse geschrieben (mit Hilfe einiger Threads aus dem Forum hier). Diese Klasse soll bei aufruf der Methode play() die Datei "alarm.wav" abspielen.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    
    import java.io.File;
     
    import javax.sound.sampled.*;
     
    public class SoundMachine {
        private Clip clip;
        
        public static void main(String[] args) {
            SoundMachine sound = new SoundMachine();
            System.out.println("initialized");
            sound.play();
            System.out.println("finished");
        }
        
        public SoundMachine() {
            try {
                //AudioInputStream ais = AudioSystem.getAudioInputStream(getClass().getResource("alarm.wav"));
                //AudioInputStream ais = AudioSystem.getAudioInputStream(new File("C:\\windows\\media\\chimes.wav"));
                AudioInputStream ais = AudioSystem.getAudioInputStream(new File("C:\\alarm.wav"));
                AudioFormat format = ais.getFormat();
                DataLine.Info info = new DataLine.Info(Clip.class, format, ((int) ais.getFrameLength() * format.getFrameSize()));
                clip = (Clip) AudioSystem.getLine(info);
                clip.open(ais);
                
                FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
                gainControl.setValue(1.0F);
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }
        
        public void play() {
            clip.start();
            clip.loop(-1);
        }
        
        public void stop() {
            clip.stop();
        }
    }

    Nun habe ich das Problem, dass ich immer die folgende Fehlermeldung bekomme. Wenn ich es mit der Windows Sounds aus C:\windows\media versuche (Zeile 18), kriege ich keine Fehlermeldung aber auch keinen Sound.

    javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
    at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1170)
    at SoundMachine.<init>(SoundMachine.java:19)
    at SoundMachine.main(SoundMachine.java:9)
    Exception in thread "main" java.lang.NullPointerException
    at SoundMachine.play(SoundMachine.java:34)
    at SoundMachine.main(SoundMachine.java:11)
    initialized
    Wär froh über euere Hilfe, denn ich komm zur Zeit einfach nicht auf einen grünen Zweig.

    Grüsse
    Flo
     

  2. #2
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin,

    ein Blick in die API (http://download.oracle.com/javase/6/docs/api/) sagt dazu folgendes :
    An UnsupportedAudioFileException is an exception indicating that an operation failed because a file did not contain valid data of a recognized file type and format.
    Da ist dann wohl was mit der Datei nicht in Ordnung ...

    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  3. #3
    flofank flofank ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    5
    Zitat Zitat von vfl_freak Beitrag anzeigen
    Da ist dann wohl was mit der Datei nicht in Ordnung ...
    Da ansonsten keine Software auf meinem PC Probleme mit dieser Datei hat befürchte ich, dass wohl Java ein Problem mit irgendwas an meiner Datei hat. Nur habe ich keine Ahnung was das sein könnte.

    Hinzu kommt noch der Effekt, dass das Programm mit den Win-Sounds zwar keine Problem hat, sie aber trotzdem nicht abspielt.
    Geändert von flofank (18.10.11 um 16:40 Uhr)
     

  4. #4
    Avatar von j2se
    j2se j2se ist offline Mitglied Silber
    Registriert seit
    Oct 2011
    Beiträge
    94
    Blog-Einträge
    1
    Ich habe den Java-Code verwendet, um eine Windows Datei namens Ding.wav abzuspielen. Die JVM hat keine Fehler gemeldet, ich konnte aber nichts hören.

    Im folgenden Link findest Du den nötigen lauffähigen Java-Code (nicht von mir): http://www.anyexample.com/programmin...sound_file.xml
    Geändert von j2se (18.10.11 um 22:28 Uhr)
     

  5. #5
    flofank flofank ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    5
    Zitat Zitat von j2se Beitrag anzeigen
    Ich habe den Java-Code verwendet, um eine Windows Datei namens Ding.wav abzuspielen. Die JVM hat keine Fehler gemeldet, ich konnte aber nichts hören.

    Im folgenden Link findest Du den nötigen lauffähigen Java-Code (nicht von mir): http://www.anyexample.com/programmin...sound_file.xml
    Vielen Dank für die Rückmeldung. Über den Code im Link bin ich auch bereits einmal gestolpert, hab ihn aber liegen lassen, da ich ungern Zeug in meinen Programmen habe von dem ich nicht weis was es macht. Ich werd ihn gleich mal testen und mich gegebenenfalls genauer einarbeiten.
     

  6. #6
    flofank flofank ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    5
    So - Hab mir den Link jetzt mal genauer angeschaut und dabei folgende Lösung für mein Problem erhalten. Die ursprüngliche Datei funktioniert immer noch nicht aber mit Win-Sounds komme ich jetzt zu recht.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    
    import java.io.File;
    import javax.sound.sampled.*;
     
     
    public class SoundMachine extends Thread{   
        private File sf;
        private final int EXTERNAL_BUFFER_SIZE = 524288;
        private SourceDataLine line = null;
        private AudioInputStream ais = null;
                 
        public SoundMachine(String path) {
            try {
                sf = new File(path);
            } catch (Exception e) {
                System.out.println("No Wave file found at :" + path);
            }
            init();
        }
        
        public void init() {
            long now = System.currentTimeMillis();
            if (!sf.exists()) {
                System.out.println("Wave file not found: " + sf.getName());
                return;
            }
            
            try {
                ais = AudioSystem.getAudioInputStream(sf);
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }
            
            AudioFormat format = ais.getFormat();
            DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
            
            try {
                line = (SourceDataLine) AudioSystem.getLine(info);
                line.open(format);
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }
            FloatControl gain = (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN);
            gain.setValue(gain.getMaximum());
        }
        
        @Override
        public void run() {
            line.start();
            int nBytesRead = 0;
            byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
            try {
                while(nBytesRead != -1) {
                    nBytesRead = ais.read(abData, 0, abData.length);
                    if (nBytesRead >= 0) {
                        line.write(abData,  0, nBytesRead);
                    } 
                }
            } catch (Exception e) {
                e.printStackTrace();
                return;
            } finally {
                line.drain();
                line.close();
            }
        }
    }

    Hatte dann aber das Problem, dass ich meinen (sehr kurzen) Alarmsound mit dieser Klasse nicht vernünftig Loopen konnte (Ladezeiten zwischen loops). Deshalb machte ich mich noch einmal auf die Suche mit Google und landete wieder bei den Clips.
    Hier jetzt meine finale Lösung:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    import java.io.File;
     
    import javax.sound.sampled.*;
     
     
    public class SoundMachine3 {
        Clip clip;
        
        public SoundMachine3(String path) {
            try {
                AudioInputStream ais = AudioSystem.getAudioInputStream(new File(path));
                clip = AudioSystem.getClip();
                clip.open(ais);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        public void start() {
            clip.loop(10);
        }
    }

    Achja - Falls jemand noch ne Idee hat wieso meine Wav-Datei nicht funktioniert freue ich mich über jeden Hinweis.

    Gruss
    Flo
     

  7. #7
    SE Tutorials.de Gastzugang
    nicht unterstütztes Format !

    Die Java Sound API kann nun mal nur mit sehr wenigen Formaten umgehen. Im groben sind das WAV , SND und AU. Und da WAV nicht gleich WAV ist gibt auch innerhalb eines Format-Containers *WAV* mehrere Formate *mono/stereo/multi-Channel , 8Bit/16Bit , Abtastraten , etc* ... und davon kann Java nun mal nur sehr wenig und ganz bestimmte. Und wenn deine WAV da nicht reinpasst dann kann Java damit auch nichts anfangen.

    Wenn du wirklich ALLE Container mit allen Formaten abspielen willst brauchst du eine Lib die das auch kann ... mit Java selbst ist das nur sehr beschränkt möglich.
     

Ähnliche Themen

  1. Java Abspielen von Wave-Dateien
    Von chrian im Forum Java
    Antworten: 8
    Letzter Beitrag: 14.02.11, 18:14
  2. Antworten: 0
    Letzter Beitrag: 12.03.09, 09:04
  3. Wave in Ressource einbinden und abspielen
    Von horstxxl im Forum VisualStudio & MFC
    Antworten: 3
    Letzter Beitrag: 28.10.07, 22:53
  4. Java & Mp3 / Ogg Vobis / Wave
    Von Thomas Darimont im Forum Java
    Antworten: 0
    Letzter Beitrag: 20.08.04, 18:22
  5. Mozilla und Audio(WAVE) abspielen
    Von deepgreen im Forum HTML & XHTML
    Antworten: 1
    Letzter Beitrag: 20.06.03, 03:28

Stichworte