Aus wav-datei lesen und in neue wav-datei speichern

Henry939

Aktives Mitglied
Hallo Freunde der Sonne, ich möchte ein Programm schreiben, daß aus wav-Dateien eine Datensequenz ausliest und diese in eine eigenständige neue wav-Datei speichert. Leider weiß ich nicht so recht, wie ich an das Problem herangehen soll, und brauchbare Beispielcodes finde ich auch nicht. Hätte jemand Tipps für moich zur Umsetzung? Ich wäre sehr dankbar!

Bitte OHNE die Einbeziehung von Thread-Techniken
 
Zuletzt bearbeitet:
Ist dir nicht klar wie du den entsprechenden Ausschnitt bestimmen sollst oder ist dir nicht klar wie du in *.wav-Dateien lesen und schreiben sollst ?
 
Mir ist nicht so recht klar, wie ich in wav-dateien lesen und wie ich sie überhaupt erstellen/schreiben soll.
Ich habe im Internet ein Beispiel gefunden, wie man eine wav-Datei erstellt, allerdings arbeitet dieses mit Threads und allgemein arbeitet es unverständlich:


Java:
import javax.sound.sampled.*;
import java.io.*;
/**
* A sample program is to demonstrate how to record sound in Java
* author: www.codejava.net
*/
public class JavaSoundRecorder {
    // record duration, in milliseconds
    static final long RECORD_TIME = 60000;  // 1 minute
    // path of the wav file
    File wavFile = new File("E:/Test/RecordAudio.wav");
    // format of audio file
    AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
    // the line from which audio data is captured
    TargetDataLine line;
    /**
     * Defines an audio format
     */
    AudioFormat getAudioFormat() {
        float sampleRate = 16000;
        int sampleSizeInBits = 8;
        int channels = 2;
        boolean signed = true;
        boolean bigEndian = true;
        AudioFormat format = new AudioFormat(sampleRate, sampleSizeInBits,
                                             channels, signed, bigEndian);
        return format;
    }
    /**
     * Captures the sound and record into a WAV file
     */
    void start() {
        try {
            AudioFormat format = getAudioFormat();
            DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
            // checks if system supports the data line
            if (!AudioSystem.isLineSupported(info)) {
                System.out.println("Line not supported");
                System.exit(0);
            }
            line = (TargetDataLine) AudioSystem.getLine(info);
            line.open(format);
            line.start();   // start capturing
            System.out.println("Start capturing...");
            AudioInputStream ais = new AudioInputStream(line);
            System.out.println("Start recording...");
            // start recording
            AudioSystem.write(ais, fileType, wavFile);
        } catch (LineUnavailableException ex) {
            ex.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
    /**
     * Closes the target data line to finish capturing and recording
     */
    void finish() {
        line.stop();
        line.close();
        System.out.println("Finished");
    }
    /**
     * Entry to run the program
     */
    public static void main(String[] args) {
        final JavaSoundRecorder recorder = new JavaSoundRecorder();
        // creates a new thread that waits for a specified
        // of time before stopping
        Thread stopper = new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(RECORD_TIME);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
                recorder.finish();
            }
        });
        stopper.start();
        // start recording
        recorder.start();
    }
}

DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
Lese ich das richtig oder bindet er hier eine ausführbare Klassendatei ein?

Thread stopper = new Thread(new Runnable() {
Runnable ist ein Interface, wie kann man von einem Interface ein Objekt erzeugen?
 
Zuletzt bearbeitet von einem Moderator:
Ehrlich gesagt ist das nicht wirklich unverständlich sondern sogar ziemlich einfach. Allerdings wird hier auch keine .wav datei gelesen sondern geschrieben. Was Du willst ist ja ganz was anderes.
Warum liest du nicht einfach mal was einführendes statt dir irgendwelchen Code aus dem Internet zu suchen den du eh nicht verstehst?

http://www.labbookpages.co.uk/audio/javaWavFiles.html

Gruß

Claus
 
Mir war klar, daß das Beispiel eine wav-Datei aufnimmt. Nur diese beiden Codezeilen waren mir unverständlich. Könntest du sie mir nochmal erläutern?

In deiner Beispielwebseite gibt es das Problem, daß dort Klassen (WavFile) eingebunden werden, die Java garnicht kennt.
 
Zuletzt bearbeitet:
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
Lese ich das richtig oder bindet er hier eine ausführbare Klassendatei ein?

Nein er übergibt eine Typinformation

Thread stopper = new Thread(new Runnable() {
Runnable ist ein Interface, wie kann man von einem Interface ein Objekt erzeugen?

Schau dir anonyme Klassen an:
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html


In deiner Beispielwebseite gibt es das Problem, daß dort Klassen (WavFile) eingebunden werden, die Java garnicht kennt.
Deswegen gibt es ja auch einen Download Button auf der Seite
 
Wie ich bereits sagte. Lesen bildet. Wenn Du keine Lust dazu hast dann kann ich auch nicht helfen.... Auf der Seite stehen alle notwendigen Infos aber nur das Kopieren des Codes bringt dir da genau so wenig wie überall anders auch... Ich bin dann raus.
 
"Nein er übergibt eine Typinformation"
Aber warum ist die Typdefinition eine class-Datei? Das Wort "class" wird sogar farbig makiert, und mir wurde auch beigebracht, dass sich Namen und Bezeichner niemals aus Schlüsselwörtern zusammensetzen dürfen: Ich verstehe das nicht 🙁

Das mit dem Download habe ich später noch bemerkt, das funktioniert auch alles, aber nur fehlerhaft in der Programmausführung.
 
Aber warum ist die Typdefinition eine class-Datei?
Weil es sich hierbei nicht um eine class-Datei handelt sondern eben eine Typeinformation.

Das Wort "class" wird sogar farbig makiert, und mir wurde auch beigebracht, dass sich Namen und Bezeichner niemals aus Schlüsselwörtern zusammensetzen dürfen: Ich verstehe das nicht 🙁
Nein das sollte man vermeiden, aber eine Zusammensetzung aus mehreren Schlüsselwörtern ist nicht verboten.
 

Zurück
Oben