# Iterieren durch einen Ordner mit Audiodateien und verketten eine andere Audiodatei



## diddle para (19. Mrz 2018)

Ich versuche, ein kleines Programm in Java zu erstellen, das eine Audiodatei (silence_2sec.wav) an alle Audiodateien in einem bestimmten Verzeichnis (/ audiofiles) einzeln anfügt.

Ich bin bei der folgenden Idee angekommen, aber leider funktioniert die 'for'-Schleife nicht - die Ausgabe ist nur eine Verkettung einer Datei aus dem angegebenen Verzeichnis (/ audiofiles) mit der Audiodatei im Programmverzeichnis (silence_2sec.wav)

Kann jemand vorschlagen, warum die "for"-Schleife nicht alle Dateien in den Audiodateien (/ audiofiles) durchläuft und den Prozess für jeden von ihnen ausführt?

Bisher:-


```
import java.io.File;
import java.util.*;
import java.io.*;
import javax.sound.sampled.*;

public class silapp_2e{

public static void main(String[]args)
    {
       
        String wavFile2 = "silence_2sec.wav";
       
        File dir = new File("audiofiles");
        File[] directoryListing = dir.listFiles();

    for (File f : directoryListing) {
       
              try {
           
                int x = 0; x++;
           
                 String fileName = (f.getAbsolutePath());

                 AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File(f.getAbsolutePath()));
                 AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(wavFile2));
              
                 AudioInputStream appendedFiles =
                     new AudioInputStream(
                     new SequenceInputStream(clip1, clip2),    
                     clip1.getFormat(),
                     clip1.getFrameLength() + clip2.getFrameLength());

                 AudioSystem.write(appendedFiles,
                 AudioFileFormat.Type.WAVE,

                    new File("output" + x + ".wav"));

             
                   
            } catch (Exception e) {
            e.printStackTrace();
            }
          }
    }
   }
```


----------



## fhoffmann (20. Mrz 2018)

```
int x = 0; x++;
```
Danach ist x = 1; du solltest x vor der for-Schleife initialisieren.


----------



## diddle para (20. Mrz 2018)

Vielen Dank für den Gedanken - leider wird die Schleife auch nicht iteriert, wenn ich die 'int = x' Definition außerhalb der 'for' Schleife platziere


----------



## MoxxiManagarm (20. Mrz 2018)

> File dir = new File("audiofiles");


audiofiles ist an der Stelle ein relativer Pfad. Du solltest auf jeden Fall überprüfen, ob dieser relative Pfad überhaupt gefunden wird. Lass dir am besten mal den absoluten Pfad ausgeben und die Länge des Arrays. Ich gehe davon aus das audiofiles nicht gefunden wird, daher findet die Iteration auch keine Elemente (leeres Arrays) und führt nichts aus.


----------



## mrBrown (20. Mrz 2018)

MoxxiManagarm hat gesagt.:


> audiofiles ist an der Stelle ein relativer Pfad. Du solltest auf jeden Fall überprüfen, ob dieser relative Pfad überhaupt gefunden wird. Lass dir am besten mal den absoluten Pfad ausgeben und die Länge des Arrays. Ich gehe davon aus das audiofiles nicht gefunden wird, daher findet die Iteration auch keine Elemente (leeres Arrays) und führt nichts aus.


In dem Fall gebe es kein leeres Array, sondern null und dementsprechend eine NPE.


----------



## diddle para (20. Mrz 2018)

Danke für deine Idee. Das relativer Pfad 'audiofiles' wird gefunden - das Programm erzeugt eine Ausgabedatei von dort korrekt, aber es passiert nicht, dass die Dateien im Pfad 'audiofiles' durchgelauft werden. Das folgende Programm durchläuft das Verzeichnis und gibt die Namen korrekt aus: -


```
import java.io.File;

public class list3f{

public static void main(String[]args)
    {
      File dir = new File("audiofiles");
      File[] directoryListing = dir.listFiles();

            for (File f : directoryListing) {
                System.out.println("output " + f.getName());
            }
    }
}
```

- Ich glaube also, dass das Problem in der Interaktion des Iterationsprozesses und des Audiodatei-Verkettungsprozesses liegt


----------



## mrBrown (20. Mrz 2018)

Die Iteration wird auch in deinem obigen Programm funktionieren - das kannst du auch ganz leicht überprüfen, indem du dort auch eine Ausgabe einbaust (außer es gibt einen Error, das solltest du aber merken).

Das Problem bei deinem Obigen Code wurde ja schon genannt. Poste doch noch mal den korrigierten Code


----------



## diddle para (20. Mrz 2018)

mrBrown hat gesagt.:


> Das Problem bei deinem Obigen Code wurde ja schon genannt



Meinen sie die folgende? :-



MoxxiManagarm hat gesagt.:


> Lass dir am besten mal den absoluten Pfad ausgeben und die Länge des Arrays.



Ich frage nur weil, wie ich gesagt habe, es findet eine der Audiodateien im Verzeichnis "audiofiles" korrekt, aber nur eine.


----------



## MoxxiManagarm (20. Mrz 2018)

Nein er meinte die Korrektur mit dem x vor for-each


----------



## diddle para (20. Mrz 2018)

Wie so ? :-


```
import java.io.File;
import java.util.*;
import java.io.*;
import javax.sound.sampled.*;

public class silapp_2f{

public static void main(String[]args)
    {
       
        String wavFile2 = "silence_2sec.wav";
       
        File dir = new File("audiofiles");
        File[] directoryListing = dir.listFiles();
       
    int x = 0; x++;   

    for (File f : directoryListing) {
       
              try {
           

                 AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File(f.getAbsolutePath()));
                 AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(wavFile2));
              
                 AudioInputStream appendedFiles =
                     new AudioInputStream(
                     new SequenceInputStream(clip1, clip2),    
                     clip1.getFormat(),
                     clip1.getFrameLength() + clip2.getFrameLength());

                 AudioSystem.write(appendedFiles,
                 AudioFileFormat.Type.WAVE,

                    new File("output" + x + ".wav"));

             
                   
            } catch (Exception e) {
            e.printStackTrace();
            }
          }
    }
   }
```

das habe ich auch versucht, mit dem gleichen Ergebnis - es verarbeitet eine Datei im Ordner "audiofiles", aber kein mehr. Soweit ich sehen kann, liegt das Problem in der Interaktion der for-Schleife und der AudioInputStream-Funktion


----------



## mrBrown (20. Mrz 2018)

Welchen Wert hat denn wohl x die ganze Zeit über und in welcher Datei wird deshalb jedes Ergebnis gespeichert?


----------



## diddle para (20. Mrz 2018)

Mit dem Wert 'x' wird bei jeder Ausführung der for-Schleife eine Iteration im Namen der Ausgabedatei erstellt.

Das Programm muss die Anzahl der Dateien im Verzeichnis "audiofiles" finden und es dann für jede Audiodatei in diesem Verzeichnis mit der "wavFile2" verketten

Z.B, wenn es also im Audiodatei-Verzeichnis 5 Audiodateien gibt, liest es jedes Audiodatei einzeln, verkettet es mit der Datei "wavFile2" und gibt dann die Dateien "output1.wav" .. bis "output5.wav" aus.


----------



## mrBrown (20. Mrz 2018)

wo innerhalb der Schleife wird denn x verändert?




diddle para hat gesagt.:


> Mit dem Wert 'x' wird bei jeder Ausführung der for-Schleife eine Iteration im Namen der Ausgabedatei erstellt.


Ist deutsch deine Muttersprache?


----------



## VfL_Freak (20. Mrz 2018)

Moin,


fhoffmann hat gesagt.:


> int x = 0; x++;


Ist Dir überhaupt, was diese beiden Zeilen (JA, es sind zwei Programmzeilen) machen?



fhoffmann hat gesagt.:


> int x = 0;


Dies deklariert und initialisiert die Variable 'x'



fhoffmann hat gesagt.:


> x++;


Hiermit wird der Wert inkrementiert!

Jetzt überleg' mal, welche Zeile WO aufgerufen werden muss!

VG Klaus


----------



## diddle para (20. Mrz 2018)

mrBrown hat gesagt.:


> wo innerhalb der Schleife wird denn x verändert?



In meinem ursprünglichen Programm war der 'x' Wert innerhalb der for-Schleife. In diesem Thread wurde vorgeschlagen, dies zu ändern



mrBrown hat gesagt.:


> Ist deutsch deine Muttersprache?



Nein

Das Problem, das ich lösen muss, ist, warum die for-Schleife nicht durch eine Reihe von Audio-Verkettungs- und -Ausgabeprozessen iteriert


----------



## mrBrown (20. Mrz 2018)

diddle para hat gesagt.:


> In meinem ursprünglichen Programm war der 'x' Wert innerhalb der for-Schleife. In diesem Thread wurde vorgeschlagen, dies zu ändern


In deiner alten Variante hast du in jedem Durchlauf der Schliefe einen neue Variable x deklariert.

Du musst die Variabel *vor* der Schleife deklarieren und *in* der Schleife inkrementieren.


----------



## VfL_Freak (20. Mrz 2018)

mrBrown hat gesagt.:


> Du musst die Variabel *vor* der Schleife deklarieren und *in* der Schleife inkrementieren.


genau!
Siehe auch #14 
VG Klaus


----------



## diddle para (20. Mrz 2018)

mrBrown hat gesagt.:


> In deiner alten Variante hast du in jedem Durchlauf der Schliefe einen neue Variable x deklariert



Danke sehr - Licht in der Dunkelheit!


----------

