WAV-Samples bearbeiten oder: 2 Bytes -> short -> float

  • Themenstarter Gelöschtes Mitglied 9001
  • Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gelöschtes Mitglied 9001

Gast
Hallo,

ich möchte WAV-Daten auslesen, bearbeiten und wieder schreiben. Das Laden einer WAV-Datei und das Wiedergeben mit SourceDataLine von AudioSystem.getLine klappt.
Die Daten liegen in einem byte-Array vor.
Meine Wav-Dateien sind in 16 Bit, also habe ich pro Sample und Kanal 2 Bytes, z.B.

puffer[i+0] 1. Byte des i-ten Samples des linken Kanals
puffer[i+1] 2. Byte des i-ten Samples des linken Kanals
puffer[i+2] 1. Byte des i-ten Samples des rechten Kanals
puffer[i+3] 2. Byte des i-ten Samples des linken Kanals

Nun möchte ich die Sample-Daten aber bearbeiten und benötige sie daher als float-Werte. Wie bekomme ich aus den beiden Bytes einen korrekten float-Wert und wie wandle ich diesen float-Wert nach Bearbeitung wieder in zwei richtige Bytes um?

Code:
float x1 = puffer[i+0] + puffer[i+1]*256
int x2 = puffer[i+0] | (puffer[i+1] << 8)
habe ich probiert, liefert aber nicht das richtige Ergebnis, denn nach dem Wiederzusammensetzen des unbearbeiteten Samples kam nicht mehr der Originalklang heraus.

Danke für alle Tipps!
 
L

Lübecker

Gast
Hallo, ich hatte vor kurzem das gleiche Problem und habe es mit ByteArray- und Data-Streams gelöst:
Code:
ByteArrayInputStream byteIn;
DataInputStream dataIn;
byte content[] = new byte[4];
float result = 0;

for (int i=0; i<4; i++)
{
	content[i] = (byte) readByte();
}
byteIn =  new ByteArrayInputStream(content);
dataIn = new DataInputStream(byteIn);
result = dataIn.readFloat();
Der in Bytes zerlegte Floatwert wird nach content gelesen (content[0] = msb, content[3] = lsb), aus dem byteArray wird dann ein ByteArrayInputStream erzeugt, aus welchem wiederum ein DataInputStream generiert werden kann. readFloat() interpretiert 4 Bytes des DataStreams als Float und liefert die korrekte Zahl zurück.
Ich hoffe das hilft dir weiter!

Gruß
 

Rock Lobster

Bekanntes Mitglied
Bin auch grad dabei, Audio-Sachen zu programmieren, und habe mir dafür auch ein paar Funktionen geschrieben, vielleicht ist da was für Dich dabei:

Code:
public class AudioTools
{
	public static float[] getFloatArray(byte[] bytes, int bitRate, int numChannels)
	{
		int k = 0;
		int size = bytes.length*2;
		float[] floats = new float[0];
		
		switch(bitRate)
		{
		case 8:
			floats = new float[size/numChannels];
			
			if (numChannels == 2)
				for(int i=0; i<size/numChannels; i++)
					floats[i]	= ui8tof(bytes[i]);
			else
				for(int i=0; i<size/numChannels/2; i+=2)
				{
					floats[i]	= ui8tof(bytes[i]);
					floats[i+1]	= ui8tof(bytes[i]);
				}
			
			break;
			
		case 16:
			floats = new float[size/2/numChannels];
			
			if (numChannels == 2)
				for(int i=0; i<size/numChannels; i+=2)
				{
					floats[k]	= i16tof(bytes[i+1], bytes[i]);
					k++;
				}
			else
				for(int i=0; i<size/numChannels/2; i+=4)
				{
					floats[k]	= i16tof(bytes[i+1], bytes[i]);
					floats[k+1]	= i16tof(bytes[i+1], bytes[i]);
					k+=2;
				}
			
			break;
		}
		
		return floats;
	}
	
	
	public static byte[] getByteArray(float[] floats, int bitRate, int numChannels)
	{
		int k = 0;
		int size = floats.length/2;
		byte[] bytes = new byte[0];
		
		switch(bitRate)
		{
		case 8:
			bytes = new byte[size*2*numChannels];
			
			if (numChannels == 2)
				for(int i=0; i<size*numChannels; i++)
					bytes[i] = ftoui8(floats[i]);
			else
				for(int i=0; i<size*numChannels; i+=2)
				{
					bytes[i]	= ftoui8(floats[i]);
					bytes[i+1]	= ftoui8(floats[i]);
				}
			
			break;
			
		case 16:
			bytes = new byte[size*2*numChannels];
			
			if (numChannels == 2)
				for(int i=0; i<size*numChannels; i++)
				{
					ftoi16(floats[i], bytes, k);
					k+=2;
				}
			else
				for(int i=0; i<size*numChannels; i+=2)
				{
					ftoi16(floats[i], bytes, k);
					ftoi16(floats[i], bytes, k+2);
					k+=4;
				}
				
			
			break;
		}
		
		return bytes;
	}
	
	
	public static final float i16tof(byte hi, byte lo)
	{
		return (short) (hi << 8) | (short) (lo & 0xFF);
	}
	
	
	public static final void ftoi16(float f, byte[] bytes, int idx)
	{
		bytes[idx  ]	= (byte)((int)f);
		bytes[idx+1]	= (byte)((int)f >> 8);
	}
	
	
	public static final float ui8tof(byte b)
	{
		return (((short)b & 0xFF) - 128) * 256;
	}
	
	
	public static final byte ftoui8(float f)
	{
		return (byte)(((int)f/256) -128);
	}
}
 
G

Gelöschtes Mitglied 9001

Gast
Danke!

Diese Klasse enthält genau das, was ich brauche. Kann es sein, daß Bitoperationen in Pascal irgendwie einfacher zu realisieren waren? Naja egal. Jetzt funktioniert's. Danke!
 

Rock Lobster

Bekanntes Mitglied
Java ist einfach keine Sprache für solche, die gerne im Speicher rumwurschteln ;)
Schlimm ist z.B., daß es keine unsigned-Variablen gibt. Das ist besonders tragisch wenn Du mit 8-Bit-Samples rumhantierst.

Daher muß man halt leider immer ein bißchen drumrumbauen. Aber immerhin ist es möglich, wenn auch mit Aufwand ;)
 
G

Guest

Gast
Ah so, dann hab ich wohl was falsch verstanden. Dachte du wolltest für die Bitfolge des Bytearrays die entsprechende IEEE Fließkommazahl ermitteln und umgekehrt :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
Trèfle Excel-Datei nicht speicherbar, da von Java zum Bearbeiten gesperrt. Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
E Best Practice LaTeX aus Textdateien einlesen und bearbeiten Allgemeine Java-Themen 4
KaffeeFan Bilddatei einlesen und bearbeiten? Allgemeine Java-Themen 5
ms_cikar Java Excel bearbeiten spalten werden überschrieben. Allgemeine Java-Themen 4
K Apache POI Word bestimmte Textstellen bearbeiten Allgemeine Java-Themen 1
P HTML Text bearbeiten Allgemeine Java-Themen 1
D Mausgesten in Java bearbeiten. Allgemeine Java-Themen 1
J 2 PDFs zusammenführen und bearbeiten Allgemeine Java-Themen 1
GUI-Programmer Mp3 Dateien bearbeiten und speichern Allgemeine Java-Themen 3
M Umbgebungsvariable mit Java bearbeiten Allgemeine Java-Themen 4
M Threads Excel files bearbeiten Allgemeine Java-Themen 4
H ResourceBundle während Laufzeit bearbeiten Allgemeine Java-Themen 3
jstei001 Reguläre Ausdrücke bearbeiten/ändern Allgemeine Java-Themen 14
C Mit Java PDF Dateien bearbeiten. Allgemeine Java-Themen 2
T Datei lesen, bearbeiten, speichern Allgemeine Java-Themen 14
K LibreOffice Tabelle Dateien im Format .ods bearbeiten Allgemeine Java-Themen 2
N POI Passwortgeschützte Excel-Datei bearbeiten Allgemeine Java-Themen 3
N xls erstellen / bearbeiten Allgemeine Java-Themen 8
B String bearbeiten Allgemeine Java-Themen 11
0 Datein aus laufender Jar lesen und bearbeiten Allgemeine Java-Themen 10
C Auslesen + Bearbeiten einer UTF8 Datei Allgemeine Java-Themen 5
J Input/Output Dateien bearbeiten - "Best Practice" Allgemeine Java-Themen 3
B AudioInputStream, bzw. Sound bearbeiten / splitten Allgemeine Java-Themen 2
D OpenOffice Calculator Dateien mit Java bearbeiten Allgemeine Java-Themen 3
J Document Bearbeiten. Allgemeine Java-Themen 3
J JFrame / PopUp-Menü bearbeiten Allgemeine Java-Themen 2
K Word Dokument bearbeiten Allgemeine Java-Themen 2
P Vectoren bearbeiten: ConcurrentModificationException Allgemeine Java-Themen 4
R String bearbeiten Allgemeine Java-Themen 2
O PDF-Dateien bearbeiten/durchsuchen Allgemeine Java-Themen 3
ARadauer Word Datein bearbeiten Allgemeine Java-Themen 3
Noar Datei einlesen, bearbeiten, ausgeben Allgemeine Java-Themen 5
M Übergebener String bearbeiten geht nicht. Allgemeine Java-Themen 4
C Bilder automatisch bearbeiten/manipulieren Allgemeine Java-Themen 2
G Bearbeiten von Files in einem Thread Allgemeine Java-Themen 4
P Observer, nicht alle updates bearbeiten Allgemeine Java-Themen 2
C wav bearbeiten Allgemeine Java-Themen 5
S Problem beim Bearbeiten von Java-Dateien unter Linux Allgemeine Java-Themen 3
B Bestehendes Programm bearbeiten Allgemeine Java-Themen 5
T Bilder bearbeiten unglaublich langsam Allgemeine Java-Themen 9
P Mit Java ein Bild bearbeiten Allgemeine Java-Themen 3
D Mehrere Dateien einlesen & bearbeiten Allgemeine Java-Themen 2
P Excel-Datei mit Java bearbeiten Allgemeine Java-Themen 2
P String bearbeiten - mit regex? Allgemeine Java-Themen 2
M Zip - Dateien bearbeiten ..... Allgemeine Java-Themen 1
D Bilder einlesen, bearbeiten und wieder in Datei schreiben Allgemeine Java-Themen 3
M Strings binär bearbeiten Allgemeine Java-Themen 3
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2
V Input/Output Austausch von Bytes zwischen C# und Java Allgemeine Java-Themen 3
RalleYTN Input/Output Clip als ein Array von Bytes? Allgemeine Java-Themen 2
J Temperatur aus bytes auslesen. Allgemeine Java-Themen 13
Q Bytes verschwinden im CipherInputStream Allgemeine Java-Themen 1
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
J Bytes aus Socket lesen Allgemeine Java-Themen 9
Q Datentypen Short aus Bytes - Signed -> Unsigned? Allgemeine Java-Themen 9
C Datentypen int in bytes zerlegen und wieder zusammen setzen Allgemeine Java-Themen 13
K Hexadezimale Bytes Allgemeine Java-Themen 6
B bereits gelesene Bytes herausfinden Allgemeine Java-Themen 10
M FIFO Queue: bytes in, float/double/etc out Allgemeine Java-Themen 5
S String zu binary und zurück - Problem mit unsigned/signed bytes Allgemeine Java-Themen 2
TiME-SPLiNTER Von Unix, InputStreams und Null Bytes Allgemeine Java-Themen 2
K AES, Buffer und Bytes Allgemeine Java-Themen 2
S Bytes oder Hex-Werte zu Assembler Code? Allgemeine Java-Themen 6
L bytes nach int (little endian bitshift) Allgemeine Java-Themen 12
J Receive eines Hex-Bytes über COM-Port Allgemeine Java-Themen 4
G Zwei bytes vergleichen Allgemeine Java-Themen 2
M Bytes in Datei schreiben Allgemeine Java-Themen 10
T Spezielle Bytes in Datei schreiben Allgemeine Java-Themen 7
F Einlesen von Bytes Allgemeine Java-Themen 9
reibi Größe Array aus bytes Allgemeine Java-Themen 14
G RXTX verschicken einzelener Bytes Allgemeine Java-Themen 8
T Größe eine Variablen in Bytes? Allgemeine Java-Themen 22
G Mehrere Bytes auf einmal einlesen Allgemeine Java-Themen 4
P int -> 4 bytes Allgemeine Java-Themen 11
R Menge an Bytes eines OutputStreams ermitteln. Allgemeine Java-Themen 6
R Wieviele Bytes gesendet Allgemeine Java-Themen 3
T Bestimmte bytes in einer Datei ersetzen? Allgemeine Java-Themen 4
D 16-Bit int --> 2* 8-Bit Bytes Allgemeine Java-Themen 17
H Objekte verbrauchen immer mindestens 16 Bytes Allgemeine Java-Themen 3
W Array größer als 65536 Bytes Allgemeine Java-Themen 7
A RandomAccessFile - Bytes vom Anfang der Datei löschen Allgemeine Java-Themen 32
C Code of a method longer than 65535 bytes Allgemeine Java-Themen 3
L 8 bytes von bestimmter position weg lesen? Allgemeine Java-Themen 11
D 2 Bytes in ein int convertieren Allgemeine Java-Themen 2
B Umwandeln von Bytes in float Zahl (DataInputStream) Allgemeine Java-Themen 3
G 0 Bytes bei temporäre Datei. Warum? Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben