Audio + Timer

mmz27

Mitglied
Hallo zusammen

Mein Programm soll ein Bild auf dem Bildschirm anzeigen und 200ms später einen Ton abspielen. Dies habe ich wie folgt versucht zu lösen:

Java:
//load sound file
java.net.URL url = getClass().getResource("Beep.wav");
clip = Applet.newAudioClip(url);

....

//place picture
centreLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("bild.gif")));

//start timer for sound file
Date runTime = new Date(System.currentTimeMillis() + 200);
playSoundTimer = new java.util.Timer();
playSoundTimer.schedule(new TimerTask() {
	public void run() {
		clip.play();  
	}
}, runTime);

Nun ist das Problem, dass dieses Sound File nicht exakt 200ms nach dem Bild abgespielt wird sondern mit einem Delay von 50-250ms. Mir ist durchaus bewusst, dass dies eine sehr kurze Zeit ist, meine Anwendung ist zeitkritisch und soll so exakt wie möglich sein.

Hat jemand eine Idee, wie ich das genauer machen kann?

Danke & Viele Grüsse
 

AlexSpritze

Bekanntes Mitglied
Java:
//Date runTime = new Date(System.currentTimeMillis() + 200);
playSoundTimer = new java.util.Timer();
playSoundTimer.schedule(new TimerTask() {
	public void run() {
		clip.play();  
	}
}, new Date(System.currentTimeMillis() + 200));

Vielleich ist das ja schon etwas besser? Weil System.currentTimeMillis() läuft ja auch immer weiter...
 

muckelzwerg

Bekanntes Mitglied
Versuch doch alternativ mal auf nanotime() zu wechseln und statt dem Timer einen Busywait zu verwenden.
Da solltest Du besser treffen. Dann kannst Du mal schauen, wie es mit verschieden großen Sleep(...) aussieht.
 

mmz27

Mitglied
Danke für die schnellen Antworten.

Ich habe das mit wait versucht zu implementieren, was aber leider den gleichen delay zur Folge hatte.

Ich habe mal anstelle von clip.play(), das setIcon(null) gesetzt und danach am Oszilloskop mit einer Photodiode die Zeit gemessen, bei der das Bild angzeigt wird. Diese Zeit ist genau 200ms. Das heisst, dass das abspielen der Sounddatei zum delay führt.

Gibt es alternativen Methoden, um ein *.wav abzuspielen?

Vielen Dank!

Java:
 //load sound file
java.net.URL url = getClass().getResource("Beep.wav");
clip = Applet.newAudioClip(url);
 
....
 
//place picture
centreLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("bild.gif")));
 
//start timer for sound file
playSoundTimer = new java.util.Timer();
playSoundTimer.schedule(new TimerTask() {
    public void run() {
        //clip.play();  
        centreLabel.setIcon(null);
    }
}, new Date(System.currentTimeMillis() + 200));
 
S

Spacerat

Gast
Mit Clip wirst das kaum hinbekommen, denk' ich aber auf jeden Fall sollte es mit 'nem eigenen StreamerThread funktionieren, welcher den Clip - ist hier jetzt 'ne ganz schlechte Wortwahl, AudioStream wäre besser - widerholt, lückenlos aneinanderreiht. Einfach wird's nicht.
 
S

Spacerat

Gast
@muckelzwerg: sooo schwierig muss es nun doch nicht werden. Am ende fragt er noch, wie er JOAL in ein 64-Bit Betriebssystem einbinden kann :lol:. Für sein Vorhaben sollte die std. "javax.sound.sampled"-API genügen.
 
Zuletzt bearbeitet von einem Moderator:

muckelzwerg

Bekanntes Mitglied
Hm. Ist schon eine Weile her, aber damals war das ziemlich einfach.
Weiß nicht, ob sowas noch aktuell ist:
Java OpenAL tutorial


mmz27, ich fände es RICHTIG toll, wenn Du bei Gelegenheit mal ein kleines Tutorial über die Zeitmessung mit Oscar und Photodiode machen könntest.
Das können einige Leute bestimmt mal gebrauchen.
 
S

Spacerat

Gast
@muckelzwerg: Also dein Tutorial dort mitsamt OpenAL-Anbindung ist mir völlig unbekannt. Mir scheint, dass man in Sachen Hardwarebindung in Java immer mehr dazu neigt, die jeweiligen C-Libraries per JNI in Java zu "spiegeln", was meines Erachtens auch durchaus Sinn macht. Gängige Bindungen dieser Art sin

1. LWJGL: für OpenAL, OpenGL und OpenCL. Kommt allem am nächsten unterstützt aber meines Wissens keine Lightweight-Components wie z.B. Swing ist dafür aber für 32-Bit und 64-Bit verfügbar.

2. JOAL: für OpenAL. Ist ein wenig mehr objektorientierter, ist aber für Windows z.B. nur in 32-Bit verfügbar.

3. JOGL: für OpenGL. Ist ebenso wie JOAL auch ein wenig mehr objektorientierter und unterstützt auch Lightweight-Components. Seit Version 2.0 wurde es aber gravierend verändert. 2.0 ist afaik noch im Beta-Stadium und das schon recht lange.

4. JOCL: für OpenCL. Damit habe ich noch keine Erfahrungen gemacht.

Ich selbst verwende inzwischen LWJGL und verzichte dabei auf Lightweights. Der Vorteil hier: Man kann auch Tutorials durcharbeiten, welche für andere Sprachen, z.B. "C" oder "C#" konzipiert wurden, ohne gross den Code ändern zu müssen. So nun aber genug davon. Back to Topic ;)
 

muckelzwerg

Bekanntes Mitglied
WIe gesagt, das ist schon ein Weilchen her. Letztlich hab ich dann JASS für Java und RTAudio für C++ verwendet.
Aber ich hatte mit OpenAL zwischendurch keine Probleme, an die ich mich erinnere.
Was Du jetzt mit JOGL und JOCL willst, versteh ich nicht. mmz27 hat doch nach alternativen Abspielmöglichkeiten gefragt.
 
S

Spacerat

Gast
Was Du jetzt mit JOGL und JOCL willst, versteh ich nicht.
Hatte ich nur der Vollständigkeit halber erwähnt. Never mind.
Ich glaube auch kaum, dass irgend etwas davon bzw. jedwede andere Nicht-Standard-API auch nur geringfügig eine Alternative für den TS darstellt. Wie es aussieht, will er etwas mit Applets machen und da empfiehlt sich das Einbinden von externen APIs die obendrein noch JNI-Libs einbinden müssen keineswegs. Ich versuch' mich grad' an einer Alternative mit dem oben besagtem "javax.sound.sampled"-API.
 
S

Spacerat

Gast
Sorry für'n Doppelpost.
@TS: Ich bin hier auf ein älteres Beispiel mit 2 Audioclips gestossen, die direkt nacheinander abgespielt werden sollten. Die beiden Clips wurden hier jeweils in einen AudioStream gespeichert, welche durch die Verschachtelung in einem BufferedInputStream markierbar und auch zurücksetzbar werden. Mit ein wenig Javakenntnissen sollte es kein Problem sein, das Beispiel für deine Zwecke umzuschreiben.
Java:
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.SourceDataLine;

public class ClipStreamer
{
	private final AudioInputStream clip1, clip2;
	private Thread runner;
	private final byte[] buffer;
	private final SourceDataLine line;

	public static void main(String[] args)
	throws Exception
	{
		if(args == null || args.length < 2) {
			args = new String[] {"chimes.wav", "win.wav",};
		}
		new ClipStreamer(args[0], args[1]).start();
	}

	private ClipStreamer(String clip1, String clip2)
	throws Exception
	{
		BufferedInputStream c1 = new BufferedInputStream(new FileInputStream(new File(clip1)));
		BufferedInputStream c2 = new BufferedInputStream(new FileInputStream(new File(clip2)));
		this.clip1 = AudioSystem.getAudioInputStream(c1);
		this.clip2 = AudioSystem.getAudioInputStream(c2);
		AudioFormat af = this.clip1.getFormat();
		buffer = new byte[32768];
		line = AudioSystem.getSourceDataLine(af);
		line.open(af, buffer.length);
	}

	public synchronized void start()
	{
		if(runner == null) {
			try {
				clip1.mark(clip1.available());
				clip2.mark(clip2.available());
			} catch(IOException e) {
				e.printStackTrace();
				return;
			}
			runner = new Thread()
			{
				@Override
				public void run()
				{
					AudioInputStream source = clip1;
					int bytesRead;
					while(!isInterrupted()) {
						try {
							bytesRead = source.read(buffer, 0, buffer.length);
							if(bytesRead <= 0) {
								source = (source != clip2)? clip2 : clip1;
								source.reset();
								source.mark(source.available());
							} else {
								line.write(buffer, 0, bytesRead);
							}
						} catch (IOException ioe) {
							interrupt();
						}
					}
					line.flush();
					line.stop();
					runner = null;
				}
			};
			line.start();
			runner.start();
		}
	}

	public synchronized void stop()
	{
		if(runner != null) {
			runner.interrupt();
			while(runner != null) {
				// wait
			}
		}
	}
}
 
Zuletzt bearbeitet von einem Moderator:

muckelzwerg

Bekanntes Mitglied
Wenn Du es damit nicht lösen kannst, dann schau Dir vielleicht wirklich mal jass an.
Jass demos
Unter Umständen liegt es ja vielleicht an der Puffergröße oder was Ähnlichem.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Audio Datei unter Bedingungen ausführen Java Basics - Anfänger-Themen 19
R Audio kann nur zum Teil gestoppt werden Java Basics - Anfänger-Themen 1
volcanos sun.audio has been removed from Java since JDK 9 Java Basics - Anfänger-Themen 2
P eine kleine Aufgabe mit Audio Java Basics - Anfänger-Themen 1
H Audio in Java Java Basics - Anfänger-Themen 3
J Sharing Audio input Java Basics - Anfänger-Themen 6
S Hilfe bei Audio und zwischenspeicher Java Basics - Anfänger-Themen 5
P Audio Datei abspielen Java Basics - Anfänger-Themen 18
S Input/Output audio in Programm einbinden Java Basics - Anfänger-Themen 17
H audio abspielen Java Basics - Anfänger-Themen 19
M Audio Stream läuft auf :connection abort: socket write error Java Basics - Anfänger-Themen 2
M Volume beim Abspielen von Audio Dateien Java Basics - Anfänger-Themen 2
D audio wiedergabe? Java Basics - Anfänger-Themen 11
X Audio über Mikrofon einlesen Java Basics - Anfänger-Themen 4
S Java Sound mit 24 bit/96 kHz Audio? Java Basics - Anfänger-Themen 12
X Audio: Abspielen eines OutputStreams Java Basics - Anfänger-Themen 4
W Dauer einer Audio-Datei Java Basics - Anfänger-Themen 2
L Audio-Clip rauscht nur Java Basics - Anfänger-Themen 5
G Audio wiedergeben Java Basics - Anfänger-Themen 10
B Audio Signale aufnehmen & Frequenzen mit Amplitude anzei Java Basics - Anfänger-Themen 2
J Audio capturen und über's Netzwerk streamen? Java Basics - Anfänger-Themen 2
M Audio Files mit Base64 De-/Endcodieren Java Basics - Anfänger-Themen 5
S Timer vs ExecutorService: jeden Sonntag um 14.00 Uhr einen Task starten..? Java Basics - Anfänger-Themen 1
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
E multiple Timer die sich nicht summieren Java Basics - Anfänger-Themen 12
Jan_x8 Timer/Scanner Java Basics - Anfänger-Themen 5
C Timer aktualisieren Java Basics - Anfänger-Themen 5
L GUI- wie cancel ich einen Timer? Java Basics - Anfänger-Themen 10
missy72 Timer oder Timeline Java Basics - Anfänger-Themen 3
R Timer Format: 00:00:00 Java Basics - Anfänger-Themen 29
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1
D Änder der Timer Speeds Java Basics - Anfänger-Themen 1
E Timer trotz erwartender Eingabe durchlaufen lassen Java Basics - Anfänger-Themen 11
L Methoden Timer Java Basics - Anfänger-Themen 9
J Memory-Spiel Aktivierung der Methode mit Timer Java Basics - Anfänger-Themen 44
G Animation Timer Nano Time Java Basics - Anfänger-Themen 2
S Timer reseten Java Basics - Anfänger-Themen 3
T Timer stoppt zu früh Java Basics - Anfänger-Themen 7
CptK Methoden Timer & Mathematischer Denkfehler Java Basics - Anfänger-Themen 7
mobaer Swing Timer stoppen Java Basics - Anfänger-Themen 3
C Wie erstellt man einen Timer/Delay? Java Basics - Anfänger-Themen 1
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
D Timer programmieren Java Basics - Anfänger-Themen 13
N Timer funktioniert nicht beim starten Java Basics - Anfänger-Themen 3
B Timer mehrere Male ausführen Java Basics - Anfänger-Themen 4
J Timer richtig pausieren Java Basics - Anfänger-Themen 2
E Timer erstellen Java Basics - Anfänger-Themen 2
B javax.ejb.Timer wieder starten? Java Basics - Anfänger-Themen 0
S actionlistener timer Java Basics - Anfänger-Themen 9
C Wie kann ich jetzt von der Game.java auf die Timer.java zugreifen? Java Basics - Anfänger-Themen 6
S timer mit imagedatei Java Basics - Anfänger-Themen 5
S timer Java Basics - Anfänger-Themen 0
V Java Uitil Timer Stoppt nicht Java Basics - Anfänger-Themen 2
KaffeeFan Timer beenden Java Basics - Anfänger-Themen 12
K Ampelsteuerung mit Timer Java Basics - Anfänger-Themen 8
F Array und Timer Java Basics - Anfänger-Themen 2
G Timer einsetzen Java Basics - Anfänger-Themen 2
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
F Timer beendet nicht immer Java Basics - Anfänger-Themen 2
F Timer abbrechen und wieder starten Java Basics - Anfänger-Themen 5
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
W Erste Schritte Timer soll jede Sekunde Label aktualisieren Java Basics - Anfänger-Themen 5
T Timer - HILFE Java Basics - Anfänger-Themen 10
O Alternative zum swing-Timer Java Basics - Anfänger-Themen 5
A Wieso funktioniert dieser Timer nicht?? Java Basics - Anfänger-Themen 3
S timer funktion mit javax panel Java Basics - Anfänger-Themen 3
O Laufender Timer+Action Listener in Thread VS isAlive() Java Basics - Anfänger-Themen 4
O Starte Timer, während anderer Timer noch läuft. Ruft dies Schwierigkeiten hervor? Java Basics - Anfänger-Themen 0
M Schneller Timer Java Basics - Anfänger-Themen 2
C Timer aus anderer Klasse stoppen/starten Java Basics - Anfänger-Themen 3
B Timer beenden? Java Basics - Anfänger-Themen 0
G Erste Schritte Timer: In einem festgelegten Intervall eine Methode ausführen Java Basics - Anfänger-Themen 6
O Delayed Timer erstellen Java Basics - Anfänger-Themen 3
M Timer / Thread Java Basics - Anfänger-Themen 43
M Javax.swing - Timer(2 Button) Java Basics - Anfänger-Themen 17
J Timer - Swing Java Basics - Anfänger-Themen 5
A Timer: textarea.getText() mit Variable vergleichen Java Basics - Anfänger-Themen 3
D Problem mit Methode und Timer Java Basics - Anfänger-Themen 35
T Wie mache ich einen Timer der alle 2 sekunden aufgerufen wird? Java Basics - Anfänger-Themen 5
R Einfacher Timer geht nicht Java Basics - Anfänger-Themen 7
J Swing Timer Java Basics - Anfänger-Themen 3
M Einfacher Timer ;) Java Basics - Anfänger-Themen 15
M Timer für Termial-Eingaben Java Basics - Anfänger-Themen 3
C Methoden Einen Timer einbauen, aber wie? Java Basics - Anfänger-Themen 5
B Timer Java Basics - Anfänger-Themen 25
M Timer-Thread in Swing öffnet jedes Mal ein neues Fenster Java Basics - Anfänger-Themen 6
S Timer / Schleifen Verständnis Problem Java Basics - Anfänger-Themen 3
S Erste Schritte Java Timer Java Basics - Anfänger-Themen 13
E Threads Timer Java Basics - Anfänger-Themen 6
Spin KI Anfänger Frage : Timer Problem Java Basics - Anfänger-Themen 6
F Prüfen ob timer läuft Java Basics - Anfänger-Themen 6
L Erste Schritte Timer und Zugriffsattribute Java Basics - Anfänger-Themen 5
M Methoden Timer in ActionListener aufrufen Java Basics - Anfänger-Themen 2
R Klassen MemorySpiel: brauche Timer Java Basics - Anfänger-Themen 3
D Timer in Applet Java Basics - Anfänger-Themen 2
ruerob Warum ist Timer schneller als While? Java Basics - Anfänger-Themen 9
F Java Timer Frage Java Basics - Anfänger-Themen 14
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
B Timer Java Basics - Anfänger-Themen 2
S timer task problem Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben