|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#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. |
|
|
|
|
|
#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. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
non ricordo molto di java ma se setti samplerate 16000 2 canali stereo, setta almeno il buffer ampio 1 secondo: 16000x2=32000, prova
|
|
|
|
|
|
#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. |
|
|
|
|
|
#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. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
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/ |
|
|
|
|
|
#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. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
guarda anche qui https://living-sun.com/it/java/48999...ing-radio.html
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:05.




















