Java volume geluid

  • Onderwerp starter Onderwerp starter 5i5
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

5i5

Gebruiker
Lid geworden
27 jan 2009
Berichten
376
Hallo allemaal,

Ik vroeg me af of iemand hier verstand heeft van geluid met Java. Ik zit namelijk zelf al enige in de tijd met het 'vinden' van het volume van een afspelend bestand.

Wat ik doe:
  1. Laad een wav een bestand in naar een javax.sound.sampled.Clip. Ik neem dus niets op via mijn microfoon of iets dergelijks.
  2. Speel deze af, ik hoor dus ook het geluid spelen.
  3. Vraag vervolgens op welke Line het bestand gespeeld wordt. (javax.sound.sampled.Line)
  4. Ik maak een timer die elke 2 seconden wordt uitgevoerd.
  5. Deze timer vraagt het volume van de Line op d.m.v. Line.getLevel().
  6. Ik print deze waarde uit. De waarde is dan altijd -1 geen idee hoe het komt.

Het klinkt vrij simpel, maar ik ben er al aardige tijd mee bezig, maar kan geen goede oplossing vinden. Veel tutorials/voorbeelden zijn alleen voor het opnemen van geluiden of gebruiken dezelfde methoden. Iemand die me uit de brand kan helpen?
 
Ik heb ATunes even bekeken, maar ik heb niks gezien wat me kon helpen, toch bedankt. Ik wil mijn code best opsturen;

Code:
import java.io.File;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.Control;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Line;
import javax.sound.sampled.Line.Info;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.UnsupportedAudioFileException;

public class ClipTest
{

	Clip clip;
	Timer timer;
	long pos;
	Line lin;
	DataLine dat;
	Mixer mix;
	Line li;
	Control fc;

	public ClipTest()
	{
		AudioInputStream sound = findSound();
		clip = soundToClip(sound);
		clipEndPlaying(clip);
		
		clip.setMicrosecondPosition(100000000);
		clip.start();

		timer = new Timer();
		timer.scheduleAtFixedRate(new printVolume(), 5000, 10000);

		// play the sound clip
		
	}

	private class printVolume extends TimerTask
	{

		@Override
		public void run()
		{
			System.out.println("Time check");
			if (clip.isOpen()) {
				//clip.setFramePosition((int) pos);
				float b = -1;
				
				Info f = clip.getLineInfo();
				try {
					Mixer mix = AudioSystem.getMixer(null);
					DataLine a = (DataLine) mix.getLine(f);//(SourceDataLine) AudioSystem.getLine(f);
					b = a.getLevel();
				} catch (LineUnavailableException ex) {
					Logger.getLogger(ClipTest.class.getName()).log(Level.SEVERE, null, ex);
				}
				
				//if (b != -1) {
					System.out.println("Vol: " + b);
				//}
			} else {
				timer.cancel();
			}
		}
	}

	AudioInputStream findSound()
	{
		// specify the sound to play
		// (assuming the sound can be played by the audio system)
		File soundFile = new File("./sounds/voice.wav");
		System.out.println(soundFile.getAbsolutePath());
		AudioInputStream sound = null;
		try {
			sound = AudioSystem.getAudioInputStream(soundFile);
		} catch (UnsupportedAudioFileException ex) {
			Logger.getLogger(ClipTest.class.getName()).log(Level.SEVERE, null, ex);
		} catch (IOException ex) {
			Logger.getLogger(ClipTest.class.getName()).log(Level.SEVERE, null, ex);
		}
		System.out.println("Sound loaded");
		return sound;
	}

	Clip soundToClip(AudioInputStream sound)
	{
		// load the sound into memory (a Clip)
		DataLine.Info info = new DataLine.Info(Clip.class, sound.getFormat());
		try {
			lin = AudioSystem.getLine(info);
			clip = (Clip) AudioSystem.getLine(info);
		} catch (LineUnavailableException ex) {
			Logger.getLogger(ClipTest.class.getName()).log(Level.SEVERE, null, ex);
		}
		try {
			clip.open(sound);
		} catch (LineUnavailableException ex) {
			Logger.getLogger(ClipTest.class.getName()).log(Level.SEVERE, null, ex);
		} catch (IOException ex) {
			Logger.getLogger(ClipTest.class.getName()).log(Level.SEVERE, null, ex);
		}
		System.out.println("Clip was made");
		return clip;
	}

	void clipEndPlaying(Clip clip)
	{
		// due to bug in Java Sound, explicitly exit the VM when
		// the sound has stopped.
		clip.addLineListener(new LineListener()
		{

			public void update(LineEvent event)
			{
				System.out.println("Line: " + event.getLine().getLineInfo());
				dat = (DataLine) event.getLine();
				if (event.getType() == LineEvent.Type.STOP) {
					System.out.println("Done");
					event.getLine().close();
					System.exit(0);
				}
			}
		});
	}

	public static void main(String[] args) throws Exception
	{
		new ClipTest();
		System.out.println("main  - End");
	}
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan