Ho lasciato da parte la lettura degli MP3 per fare l'overlap. Prima forse è meglio concentrarsi su quello che il linguaggio è supportato a fare, leggere i file WAVE.
Ho scoperto anche un'altra classe del package "com.db.media.audio"
MixingAudioInputStream
che prende come valori un formato audio e una collezione di AudioInputStream.
Grazie a documentazioni varie, sono riuscito a scrivere questa funzione:
codice:
public void merge(String s1, String s2, String output)
{
int sampleRate = 44100;
File f1 = new File(s1);
File f2 = new File(s2);
File fOut = new File(output);
AudioInputStream ais1;
AudioInputStream ais2;
Collection audioList = new ArrayList();
MixingAudioInputStream mixed;
try
{
AudioFormat af = new AudioFormat((float)sampleRate, 16, 1, true, true );
// 1st Audio file ----------------------------------------------------------------------
ais1 = AudioSystem.getAudioInputStream(f1);
AudioFormat audioFormat1 = ais1.getFormat();
DataLine.Info dataLine1 = new DataLine.Info(SourceDataLine.class, audioFormat1);
SourceDataLine source1 = (SourceDataLine) AudioSystem.getLine(dataLine1);
// 1st Audio file ----------------------------------END---------------------------------
// 2nd Audio file ----------------------------------------------------------------------
ais2 = AudioSystem.getAudioInputStream(f2);
AudioFormat audioFormat2 = ais2.getFormat();
DataLine.Info dataLine2 = new DataLine.Info(SourceDataLine.class, audioFormat2);
SourceDataLine source2 = (SourceDataLine) AudioSystem.getLine(dataLine2);
// 2nd Audio file ----------------------------------END---------------------------------
audioList.add(ais1.read());
audioList.add(ais2.read());
readAudio(ais1, audioFormat1, source1);
System.out.println("POOOOOOOOOO"); // debug per verificare le letture
readAudio(ais2, audioFormat2, source2);
System.out.println(audioList);
mixed = new MixingAudioInputStream(audioFormat1, audioList);
AudioInputStream aisM = AudioSystem.getAudioInputStream(mixed);
AudioSystem.write(aisM, AudioFileFormat.Type.WAVE, fOut);
System.out.println("1st: " + s1 + ": " + audioFormat1 + " " + ais1.getFrameLength() + "\n2nd: " + s2 + ": " + audioFormat2 + " " + ais2.getFrameLength());
System.out.println("Created: " + output + ": " + mixed.getFormat() + " " + mixed.getFrameLength());
} catch (UnsupportedAudioFileException ex)
{
Logger.getLogger(MP3Merger.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex)
{
Logger.getLogger(MP3Merger.class.getName()).log(Level.SEVERE, null, ex);
} catch (LineUnavailableException ex)
{
Logger.getLogger(MP3Merger.class.getName()).log(Level.SEVERE, null, ex);
}
}
ma continuo a ricevere questo errore tentando di leggere un file wave casuale "guitarnote.wav":
codice:
Exception in thread "main" java.lang.IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
Questo vuol dire che il formato non è supportato. Allora la domanda è: Quali sono i formati supportati da Java?