Convertire BufferedInputStream in AudioInputStream

di il
2 risposte

Convertire BufferedInputStream in AudioInputStream


try {

stream=AudioSystem.getAudioInputStream(new BufferedInputStream(this.socket.getInputStream()));

} catch (UnsupportedAudioFileException e) {

                e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}
java.io.IOException: Resetting to invalid mark

at java.base/java.io.BufferedInputStream.reset(BufferedInputStream.java:446)

at java.desktop/com.sun.media.sound.SunFileReader.getAudioFileFormat(SunFileReader.java:59)

at java.desktop/com.sun.media.sound.WaveExtensibleFileReader.getAudioInputStream(WaveExtensibleFileReader.java:259)

at java.desktop/javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1010)

at ServerThread.run(ServerThread.java:49)

Ottengo questo errore perché provo a convertire i bytes dal socket stream nel AudioInputStream. I bytes non sono nel formato wave così non posso creare un oggetto AudioInputStream.
Come posso fare?

Buon lavoro a tutti,
Nicola

2 Risposte

  • Re: Convertire BufferedInputStream in AudioInputStream

    zabnicola ha scritto:


    java.io.IOException: Resetting to invalid mark

    I bytes non sono nel formato wave così non posso creare un oggetto AudioInputStream.
    E quindi in che formato è lo stream che arriva dal socket? Ovviamente, DEVE essere uno dei formati supportati e "registrati" nella Java Sound API. Se non fosse così, già questo sarebbe un errore/problema.

    La documentazione di getAudioInputStream dice chiaramente che il metodo può usare diversi parser (quelli dei formati supportati) per poter leggere in avanti tornando anche indietro al fine di determinare il formato. E quindi bisogna vedere quanto legge e di quanto deve poter tornare indietro.

    Una possibile prova è aumentare il buffer interno di BufferedInputStream (per default è 8192 bytes). Se anche aumentando molto non funziona, allora molto probabilmente quel formato audio non è adatto per funzionare in streaming. O probabilmente c'è dell'altro che ovviamente così su due piedi non posso sapere/vedere ....
  • Re: Convertire BufferedInputStream in AudioInputStream

    E quindi in che formato è lo stream che arriva dal socket? Ovviamente, DEVE essere uno dei formati supportati e "registrati" nella Java Sound API. Se non fosse così, già questo sarebbe un errore/problema.
    Lo stesso problema c'è l'ho con la cattura dei bytes da microfono,i byte sono sempre in un flusso continuo.
    Il problema ora è che mi serve dare la length dello stream per costruire il flusso AudioInputStream, inoltre cè un solo metodo per costruire un file wave
    
    private 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;
        }
    
    AudioFileFormat.Type afType = AudioFileFormat.Type.WAVE;
    AudioFormat adfmt = getAudioFormat();
    long cntTemp = inf.length();
    AudioInputStream ais = new AudioInputStream(bis, adfmt, cntTemp);
    try{
           int W = AudioSystem.write(ais, afType, outf);
    }catch(Exception e){
            e.printStackTrace();
    }
    
    La
    AudioSystem.write(ais, afType, outf);
    scrive su FILE E NON SU FILEINPUTSTREAM

    POSSIBILE SOLUZIONE
    posso provare a generare dei "piccoli" file sul disco locale tutti in formato wav, spedirli sul socket e ricevuti sul server li devo eseguire uno di seguito all'altro senza pause: scarico il primo file, scarico il secondo file, unisco il primo con il secondo, faccio play, se si aggiunge un nuovo file creo 1-2-3.wav e faccio play skipando 1-2, sperando che sia veloce (non ci devono essere pause)
    NON MI SEMBRA UNA BELLA O BUONA SOLUZIONE. Altrimenti?
    Ci si deve riuscire per forza perchè è un qualcosa di analogo a zoom: catturo da microfono e l'altro utente sente.
    Help (è un progetto lavorativo freelance).
Devi accedere o registrarti per scrivere nel forum
2 risposte