# Tondatei abspielen



## bandy (29. Mrz 2011)

Hallo,

wie kann man am einfachsten eine Tondatei in Java abspielen?:bahnhof:

(Typ .mid und .wav)


----------



## André Uhres (29. Mrz 2011)

Hallo Bandy,

hier ist ein Beispiel von einer Audio Anwendung. Dabei wird mit der Methode Applet.newAudioClip eine AudioClip Instanz erzeugt, welche auf einfache Weise eine Tondatei abspielen kann. Über einen Button wird der Song gestartet:


```
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;

public class Audioapp {

    public Audioapp() {
    }

    private static void createAndShowGui() {
        JFrame window = new JFrame();
        window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        window.setSize(400, 300);
        window.setLocationRelativeTo(null);
        JButton btPlay = new JButton("Play");
        window.add(btPlay, BorderLayout.PAGE_START);
        window.setVisible(true);
        btPlay.addActionListener(new ActionListener() {

            public void actionPerformed(final ActionEvent e) {
                Sound testsong = new Sound("song.mid");
                testsong.playSoundOnce();
            }
        });

    }

    public static void main(final String... args) {
        Runnable gui = new Runnable() {

            public void run() {
                createAndShowGui();
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}

class Sound {

    private AudioClip song; // Sound player
    private URL songPath; // Sound path

    Sound(final String filename) {
        songPath = getClass().getResource(filename); // Get the Sound URL
        song = Applet.newAudioClip(songPath); // Load the Sound
    }

    public void playSound() {
        song.loop(); // Play
    }

    public void stopSound() {
        song.stop(); // Stop
    }

    public void playSoundOnce() {
        song.play(); // Play only once
    }
}
```

Gruß,
André


----------



## Hoss (21. Apr 2011)

Hallo Andre,

versuche verzweifelt eine Wav Datei abzuspielen.  Hab das Beispiel aus der JavaInsel8 getestet, aber Java spielt nix ab.

Hab nun dein Beispiel mal nach eclipse kopiert. Audioapp.java und Sound.java und meine Datei uups.wav liegt im gleichen Package. Hab mir in der Soundklasse den Dateinamen und den Path anzeigen lassen. Er stimmt und die Datei wird auch gefunden. Wenn ich die Datei umbenenne, dann gibt es eine Exeption. Die wav Datei ist in Ordnung und läuft über dem Mediaplayer einwandfrei.
Nur wenn ich auf den Button klicke passiert außer der ausgabe des Dateinamens und dazugehörigen Path nix.

Gruß

Hoss


----------



## s4ke (21. Apr 2011)

Ist effektiv dasselbe wie hier:

http://www.java-forum.org/netzwerkprogrammierung/116919-radiostream-abspielen.html#post753441

Nur dass du halt als URL den Pfad zur Datei angeben musst.


----------



## Hoss (22. Apr 2011)

Das tue ich im Beispiel der Insel8 über .toURL()


```
package akkuladestand;

import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.net.MalformedURLException;

public class TestSound
{
	public static void main(String[] args) throws MalformedURLException 
	{
		File a = new File( "uups.wav" ); 
		
		 
		System.out.println(a.toURL());
		AudioClip sound;
		sound = Applet.newAudioClip( a.toURL() );
		sound.play(); 
		try
		{
			Thread.sleep( 10000 );
		} catch (InterruptedException e)
		{
			// TODO Automatisch erstellter Catch-Block
			e.printStackTrace();
		}
	}
}
```

Der Path wird richtig über 
	
	
	
	





```
System.out.println(a.toURL);
```
 wiedergegeben.
Ausgabe:
file:/E:/_Develop/BFW/Java0307/Akkuladestand/uups.wav

Das Programm läuft sollange wie der Thread schlafengelegt ist. In dieser Zeit muss die wav Datei abgespielt werden. 

Gruß
Hoss


----------



## s4ke (22. Apr 2011)

Funktioniert das jetzt so?


----------



## André Uhres (22. Apr 2011)

Hallo Hoss,

die Tatsache, dass der Mediaplayer die Datei spielt, bedeutet nicht unbedingt, dass die WAV Datei korrekt ist.

Die meisten Player haben alle Arten von intelligenten Korrektureinrichtungen um allgemeine Probleme in Sound-Dateien wieder gerade zu biegen, weil viele Sounddateien aus Editoren stammen, die beschissene Dateien liefern.

Java nimmt dagegen an, dass die Sound-Dateien richtig geschrieben wurden. Das bedeutet, dass ein paar Sound-Dateien einfach nicht mit Java abgespielt werden können.

Du könntest jetzt alle Sound-Dateien, die du spielen willst, in einen besseren Editor laden und unter einem neuen Namen speichern, was das Problem beheben könnte, so dass Java die Dateien lesen kann.

Wenn du viele Arten von WAV spielen willst, könntest du zunächst mit JMStudio aus dem JMF prüfen, ob JMF die Dateien spielen kann. Wenn JMF die Sound-Dateien abspielen kann, die das Core Java nicht lesen kann - dann verwende das JMF.

Gruß,
André


----------



## Hoss (24. Apr 2011)

Hallo s4ke,
Hallo Andre,

nun es sollte so gehen! Da aber die .Wav Datei einen Bug hat, den java nicht kompensiern kann, kommt kein Ton heraus. Hab jetzt die Datei mit dem Nero Wave Editor geladen und neu abgeschpeichert.

Jetzt spielt Java die Datei auch ab.

Danke für euere Hilfe...

Gruß
Hoss


----------



## s4ke (24. Apr 2011)

Naja, das ist so ne Sache. Baut man in sein Programm einen Korrekturmechanismus oder lässt man kaputte mp3s außenvor und verweist auf Reparatursoftware. Bei ersterem wird der Programmieraufwand höher, bei letzterem sind Nutzer genervt. Ich hab mich bei meinem Programm für letzteres entschieden.


----------



## André Uhres (25. Apr 2011)

s4ke hat gesagt.:


> Baut man in sein Programm einen Korrekturmechanismus



In den Fall schlage ich vor, JMF zu probieren, damit kann man auch schon mehr Dateien abspielen als mit Core Java.

Gruß,
André


----------



## s4ke (26. Apr 2011)

Ich weiß nicht... JMF ist doch schon seit längerem wie tot?


----------



## André Uhres (26. Apr 2011)

s4ke hat gesagt.:


> Ich weiß nicht... JMF ist doch schon seit längerem wie tot?



In der Tat wurde die API schon seit längerer Zeit aufgegeben. Anscheinend ist sie aber noch ziemlich verbreitet im Einsatz und wohl immer noch sehr nützlich. Hoss hatte mir die beanstandete Datei per Mail geschickt und JMF konnte sie einwandfrei abspielen. Wenn jedoch von der Art der Anwendung her eine Weiterentwicklung nötig ist, ist es natürlich besser, auf ein aktives Framework zurückzugreifen.

Gruß,
André


----------

