|
|
|
|
Strumenti |
16-10-2021, 17:29 | #1 |
Member
Iscritto dal: Nov 2020
Messaggi: 75
|
[java, javasound] Da AudioInputStream a File
Codice:
import javax.sound.sampled.*; import java.io.*; public class TaxiRecord { // the line from which audio data is captured private TargetDataLine line; //private File f; private FileOutputStream f; public TaxiRecord() throws FileNotFoundException { AudioFormat format = null; DataLine.Info info = null; byte tempBuffer[] = new byte[1000]; try{ format = getAudioFormat(); 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 } catch (LineUnavailableException ex) { ex.printStackTrace(); } f = new FileOutputStream("/home/zabit/Documents/liketaxi/1.wav",true); while(line.isOpen()){ int cnt = line.read(tempBuffer, 0, tempBuffer.length); System.out.println(cnt); int cntTemp = 0; for(int g = 0; g < tempBuffer.length; g++) if(tempBuffer[g] != 0) cntTemp++; System.out.println(cntTemp); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byteArrayOutputStream.write(tempBuffer, 0, tempBuffer.length); AudioFileFormat.Type afType = AudioFileFormat.Type.WAVE; AudioFormat adfmt = getAudioFormat(); ByteArrayInputStream bis = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); AudioInputStream ais = new AudioInputStream(bis, adfmt, byteArrayOutputStream.toByteArray().length); try{ int W = AudioSystem.write(ais, afType, f); byteArrayOutputStream.flush(); byteArrayOutputStream.close(); }catch(Exception e){ e.printStackTrace(); } } } 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; } } Codice:
import java.io.FileNotFoundException; public class TaxiRecordApp { public TaxiRecordApp(){ } public static void main(String[] args){ try { TaxiRecord tr = new TaxiRecord(); } catch (FileNotFoundException e) { e.printStackTrace(); } } } In pratica sto cercando di salvare lo stream catturato da microfono e registrarlo su file. Questa istruzione Codice:
f = new FileOutputStream("/home/zabit/Documents/liketaxi/1.wav",true); Il file infatti cresce anche ad un mega, dopo qualche secondo, Ma se faccio play non sento nulla. sembra segua byte[1000]; Se provo ad aumentare questo valore a diciamo 1000000 lascinado scorrere per diversi secondi sento correttamente. Piu il valore è alto piu devo attendere prima di chiudere il canale. |
17-10-2021, 08:39 | #2 |
Member
Iscritto dal: Nov 2020
Messaggi: 75
|
Nessuno?!
Perchè Se provo ad aumentare a 1000000 sento correttamente e invece con 1024 bytes non sento niente? Mi serve un valore basso perchè piu il valore è alto piu devo attendere prima di chiudere il canale perchè aspetta di leggere 1000000 bytes dalla linea del microfono, solo quando li ha disponibili scrive su File. |
17-10-2021, 09:19 | #3 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
non ricordo molto di java ma se setti samplerate 16000 2 canali stereo, setta almeno il buffer ampio 1 secondo: 16000x2=32000, prova
|
17-10-2021, 18:41 | #4 |
Member
Iscritto dal: Nov 2020
Messaggi: 75
|
Qualcuno del forum sa come posso convertire un BufferedInputStream nel AudioInputStream?
mi serve convertire tutti i bytes in un file audio cosi da avere lo stream in audio wave. |
18-10-2021, 08:59 | #6 | |
Member
Iscritto dal: Nov 2020
Messaggi: 75
|
Quote:
Ho fatto una modifica: ho trasferito tutto il flusso che catturo dal microfono al socket che si collega la server. Invio i bytes grezzi sul socket. Ricevuto i bytes dal client sul server devo convertirli in un AudioInputStream ma non vuole i bytes grezzi, vuole il file nel formato wav.Mi serve un modo per tradurre un flusso di bytes grezzi in un flusso wav. |
|
18-10-2021, 09:18 | #7 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
dalla mia esperienza i file wav hanno un header ed una parte dati: nel tuo caso, i primi 8 bit canale sinistro ed i secondi 8 bit canale destro.
Forse devi semplicemente creare l'header con le informazioni (samplerate, numero canali etc...) per il player. https://thiscouldbebetter.wordpress....-file-in-java/ |
18-10-2021, 09:27 | #8 | |
Member
Iscritto dal: Nov 2020
Messaggi: 75
|
Quote:
solo che io ho un flusso continuo senza fine che ricevo dal socket, vorrei che fosse un flusso continuo senza fine ma wav (quindi che abbia i 44 byte di intestazione. Non trovo una buona guida sul formato dell'header wav. Ho trovato questo https://onestepcode.com/read-wav-header/ chiede il ChunkSize che valore devo settare? Come faccio a creare un file con dimensione fissa se il mio flusso è continuo? Devo necessriamente prendere un istante. |
|
18-10-2021, 10:34 | #9 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
guarda anche qui https://living-sun.com/it/java/48999...ing-radio.html
|
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:45.