Audio über Mikrofon einlesen

Status
Nicht offen für weitere Antworten.

xysawq

Bekanntes Mitglied
Hallo, habe schon gründlich Google und das Forum abgesucht, einige Lösungsansätze gefunden und getestet, aber nichts ist wirklich zufriedenstellend:

Mein letzter Versuch:
Code:
import java.io.IOException;
import javax.sound.sampled.*;

import java.io.File;

public class Main
{
	public static void main(String[] args) throws IOException, InterruptedException
	{
		TargetDataLine line = null;
		DataLine.Info info = new DataLine.Info(TargetDataLine.class, getAudioFormat());
		
		try
		{
			line = (TargetDataLine) AudioSystem.getLine(info);
			line.open(getAudioFormat());
		}
		catch (LineUnavailableException e)
		{
			e.printStackTrace();
		}
		
		line.start();
		AudioInputStream stream = new AudioInputStream(line);
		
		Stopper stopper = new Stopper(line, stream);
		stopper.start();
		
		File file = new File("D:/soundfile.wav");
		AudioSystem.write(stream, AudioFileFormat.Type.WAVE, file);
		
		System.out.println("Stopped...");
		System.in.read();
	}
	
	private static AudioFormat getAudioFormat()
	{
		AudioFormat.Encoding encoding = AudioFormat.Encoding.PCM_UNSIGNED;
		
		float sampleRate = 8000.0F;
		int sampleSizeInBits = 8;
		int channels = 1;
		int frameSize = 1;
		int frameRate = 8000;
		boolean bigEndian = false;			
		
		return new AudioFormat(encoding,
							   sampleRate,
							   sampleSizeInBits,
							   channels,
							   frameSize,
							   frameRate,
							   bigEndian);
	}
}

Code:
import java.io.IOException;
import javax.sound.sampled.*;

public class Stopper extends Thread
{
	TargetDataLine line = null;
	AudioInputStream stream = null;
	
	public Stopper(TargetDataLine line, AudioInputStream stream)
	{
		this.line = line;
		this.stream = stream;
	}
	
	public void run()
	{
		System.out.println("Press [RETURN] to stop capturing...");
		
		try
		{
			System.in.read();
		}
		catch (IOException e)
		{}
		
		line.stop();
		try
		{
			stream.close();
		}
		catch (IOException e)
		{}
	}
}

Dieses kleine Programm soll über das Mikrofon Sound aufnehmen und in die Datei "soundfile.wav" speichern. (Ich möchte später meine Mikrofonaufnahme in ein RTP-Programm einbauen... also bitte keine tollen Tutorials wie: "Wie speichere ich Audio.").

Das Problem hierbei ist, dass ich jede Menge Störgeräusche in der WAV-Datei habe, ansonsten funktioniert es aber... wenn bei euch beim Testen keine Störgeräusche zu hören sind, sagt bescheid.


Eine andere Methode war noch statt:
Code:
line = (TargetDataLine) AudioSystem.getLine(info);
eher das zu nehmen:
Code:
line = (Port) AudioSystem.getLine(Port.Info.MICROPHONE);
//bzw.
line = (TargetDataLine) AudioSystem.getLine(Port.Info.MICROPHONE);

Nur leider kann man aus der Port-Variante keine Daten auslesen geschweige denn irgendetwas damit anfangen und das Casten nach TargetDataLine funktioniert nich (CastException).


Also was tun?
 

foobar

Top Contributor
Hmm, das kann eigentlich nur am AudioFormat liegen. Man sollte in mit der Sampelrate nicht unter 16 oder 22 khz gehen, weil Java damit nicht klar kommt.
Ich nehme immer in CD-Qualität auf und komprimiere dann mit Ulaw, Alaw oder JSpeex. JSpeex bringt dabei natürlich das beste Ergebnis ;-)
 

xysawq

Bekanntes Mitglied
Das Ändern der Samplerate bringt keine Verbesserung, es rauscht immernoch wie blöde...

Hab übrigens mal nen kleinen Test gemacht, der mich sehr verwundert hat:

Code:
Line.Info[] infos = AudioSystem.getTargetLineInfo(Port.Info.LINE_IN);
System.out.println(infos.length);

//und

Line.Info[] infos = AudioSystem.getTargetLineInfo(Port.Info.MICROPHONE);
System.out.println(infos.length);

geben beide 0 aus, aber:

Code:
Line.Info[] infos = AudioSystem.getSourceLineInfo(Port.Info.LINE_IN);
System.out.println(infos.length);

//und

Line.Info[] infos = AudioSystem.getSourceLineInfo(Port.Info.MICROPHONE);
System.out.println(infos.length);

geben beide 1 aus, soll heißen die SourceLines beschreiben Mikrofon und Line-In, was vom Namen her auch logisch ist.

Leider muss man das mit TargetLines machen und Ports gehen sowieso nicht, mit denen komme ich nicht klar, der Sinn ist mir fremd.


Schon irgendwie schade, dass es da nichts besseres gibt.
 

foobar

Top Contributor
Hast du das ganze mal mit einer anderen Software wie Audacity verglichen? Vielleicht liegts ja am Mikro.

Also ich mache das so:

Code:
private void startRecording()
        {
            try
            {
                recordingLine                           = (TargetDataLine) AudioSystem.getLine(new DataLine.Info(TargetDataLine.class, AUDIO_FORMAT,AudioSystem.NOT_SPECIFIED));
                AudioInputStream ais               = new AudioInputStream(recordingLine);
                AudioFormat targetFormat        = new AudioFormat(targetEncoding,AUDIO_FORMAT.getSampleRate() ,-1,AUDIO_FORMAT.getChannels(),  -1,  -1,  false);
                ais                                             = AudioSystem.getAudioInputStream(targetFormat,ais);
                recordingLine.open(AUDIO_FORMAT);
                recordingLine.start();
                timeStartRecording              = System.currentTimeMillis();
                AudioSystem.write(ais, targetType,out);
                
            }
            catch (LineUnavailableException e)
            {
                Starter.showErrorMessage( e );
            }
            catch (IOException e)
            {
                Starter.showErrorMessage( e );
            }
        }

BTW Java Sound API nervt :-(
 

xysawq

Bekanntes Mitglied
Danke für die Hilfe, bei Audacity klingt es besser, aber immernoch mit leichtem rauschen... hab mir jetzt aus nem anderen Büro ein besseres Mikro geliehen, mit dem klingt es einwandfrei :/.

Naja, danke für die Hilfe, auch wenns nicht an java lag... btw: java sound api nervt wirklich >:-(
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Audio capturen und über's Netzwerk streamen? Java Basics - Anfänger-Themen 2
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
M Audio + Timer Java Basics - Anfänger-Themen 12
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
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
M Audio Files mit Base64 De-/Endcodieren Java Basics - Anfänger-Themen 5
richis-fragen GlassPane über JScrollPane legen Java Basics - Anfänger-Themen 6
A Server - Client Nachrichtenaustausch über Eventbus Java Basics - Anfänger-Themen 12
P Neue Java v8 JRE Version nicht über alte drüber installierbar: Wie sonst? Java Basics - Anfänger-Themen 7
D Downloadfortschritt von Datei über Google Drive API v3 Java Basics - Anfänger-Themen 10
B großzügiges Pixelraster über Bildschirm legen Java Basics - Anfänger-Themen 7
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
sserio Iterierung über ein zweidimensionales Array Java Basics - Anfänger-Themen 16
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
S Java über SSH Java Basics - Anfänger-Themen 13
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
D Best Practice Ausgabe über direkte Ausgabe oder try-catch? Java Basics - Anfänger-Themen 13
R Eigenschaft über Parameter auslesen und ändern Java Basics - Anfänger-Themen 15
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
W char über die Konsole? Java Basics - Anfänger-Themen 7
EchtKeineAhnungManchmal Hallo :) ich bekomme es nicht hin eine Fehlermeldung auszugeben über die GUI Java Basics - Anfänger-Themen 3
S Array über ein Ausgabemethode in main ausgeben Java Basics - Anfänger-Themen 31
C Potenzberechnung über switch case. Taschenrechner mit Eingabe über einen grafischen Dialog Java Basics - Anfänger-Themen 22
J Wert zurückgeben über get Methode Java Basics - Anfänger-Themen 8
J Eintrag Combobox über einen String auswählen Java Basics - Anfänger-Themen 3
A Array Ansprache einer Zelle über Punktnotation? Java Basics - Anfänger-Themen 3
O Java über cmd benutzen ? Java Basics - Anfänger-Themen 5
J Variablenzugriff über string Java Basics - Anfänger-Themen 18
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
H Methode über String Wert aufrufen Java Basics - Anfänger-Themen 8
M Java Kompilieren über Package grenzen hinaus Java Basics - Anfänger-Themen 4
M Arrays mit mehreren Werten über JOptionPane initialisieren Java Basics - Anfänger-Themen 12
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
J Array über Getter erlangen Java Basics - Anfänger-Themen 34
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6
B OOP-Anfänge über CMD + Editor Java Basics - Anfänger-Themen 30
G Variablen Array Länge über den Konstruktor definieren Java Basics - Anfänger-Themen 4
L Addition von Arrays über die Parameterliste Java Basics - Anfänger-Themen 11
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
1 Erste Schritte Was denkt ihr über eines meiner ersten Javaprogramme? Java Basics - Anfänger-Themen 2
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
J Button über Pfeiltasten bewegen Java Basics - Anfänger-Themen 8
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
N Eingabe Kommazahlen über Scanner Java Basics - Anfänger-Themen 2
T DoWhile Schleife über mehrere Mothoden Java Basics - Anfänger-Themen 5
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
J Gefilterten Stream über die Konsole ausgeben Java Basics - Anfänger-Themen 1
S Variablen Klassenvariable über Objekt aufrufen Java Basics - Anfänger-Themen 16
S Bilder über Socket Senden Java Basics - Anfänger-Themen 1
K Textdatei auslesen und über Mqtt schicken Java Basics - Anfänger-Themen 4
L Iterieren über eine CSV Datei Java Basics - Anfänger-Themen 7
I GUI über Eclipse oder NetBeans Java Basics - Anfänger-Themen 23
S Klassenaufruf über JFrame Button Java Basics - Anfänger-Themen 3
Java The Hutt SetWerte über verschiedene Klassen Java Basics - Anfänger-Themen 16
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
O Methode über Leerzeichen Java Basics - Anfänger-Themen 13
I OOP Objektnamen über die Konsole richtig einlesen Java Basics - Anfänger-Themen 9
A Variablen Variablenwert über Konstruktor ändern Java Basics - Anfänger-Themen 3
J MySQL Datumsabfrage über ResultSet in Java-Servlet Java Basics - Anfänger-Themen 4
CptK Interface Bilder über Bildschirm bewegen, bis der Abstand zum vorherigen zu groß wird Java Basics - Anfänger-Themen 13
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
J Punkt auf,über,unter oder zwischen 2 Geraden Java Basics - Anfänger-Themen 14
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
R Keine Verbindung zu MySql über Netbeans Java Basics - Anfänger-Themen 15
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
J Aufruf einer Methode über einen String Java Basics - Anfänger-Themen 11
G Arraynamen über eine Schleife ansprechen Java Basics - Anfänger-Themen 4
S Bild über JButton legen Java Basics - Anfänger-Themen 3
temi Druckeransteuerung über ESC-Sequenz Java Basics - Anfänger-Themen 21
M Methodenaufruf über SQL UPDATE Java Basics - Anfänger-Themen 8
B Könnte jemand über dieses jurze Javaprogramm schauen? Irgendwas funktioniert mit der z-Varible nicht Java Basics - Anfänger-Themen 2
M Java Programm über Batch-Datei ausführen Java Basics - Anfänger-Themen 1
E Wie Passwort-Eingabe (ohne Echo!) über Konsole ? Java Basics - Anfänger-Themen 4
C Erste Schritte Fehler beim *.class Aufruf über cmd.exe Java Basics - Anfänger-Themen 9
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
P Threads Prozess kann nicht über die GUI gestartet werden Java Basics - Anfänger-Themen 8
T CMD über Java-Programm aufrufen Java Basics - Anfänger-Themen 2
X Finde die Files über FTP nicht Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben