[java] bufferizzare stream audio da mic

Stato
Chiusa ad ulteriori risposte.

zabitmrw

Nuovo Utente
17 Lug 2021
8
0
1
import javax.sound.sampled.*; import java.io.*; import java.net.*; import java.util.Arrays; /** * A sample program is to demonstrate how to record sound in Java */ public class JavaSoundRecorder { // record duration, in milliseconds static final long RECORD_TIME = 5000; // 5 seconds // format of audio file AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE; // the line from which audio data is captured TargetDataLine line; /** * Defines an audio format */ 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; } /** * Captures the sound and record into a WAV file */ void start() { try { AudioFormat format = getAudioFormat(); DataLine.Info 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,4096); line.start(); // start capturing System.out.println("Start capturing..."); byte tempBuffer[] = new byte[10000]; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); try{ int c = 0; while(line.isOpen()){ //Read data from the internal // buffer of the data line. c++; int cnt = line.read(tempBuffer, 0, tempBuffer.length); System.out.println("letti dim buffer: "+cnt+"\n"); System.out.print("letti bytes:"+Arrays.toString(tempBuffer)); if(cnt > 0){ byteArrayOutputStream.write(tempBuffer, 0, cnt); } }//end while System.out.println("numero di volte che ha letto:"+c); byteArrayOutputStream.close(); String fileName = "/home/zabit/Documents/rec.wav"; File fileStreamedWav = new File(fileName); AudioFileFormat.Type afType = AudioFileFormat.Type.WAVE; //AudioFormat adfmt = new AudioFormat(8000.0f, 8, 1, true , true); AudioFormat adfmt = getAudioFormat(); ByteArrayInputStream bis = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); AudioInputStream ais = new AudioInputStream(bis, adfmt, byteArrayOutputStream.toByteArray().length); int W = AudioSystem.write(ais, afType, fileStreamedWav); //leggi il file audio e play //invia al server socket //Socket soc = new Socket("127.0.0.1" ,4444); //DataOutputStream out = new DataOutputStream(soc.getOutputStream()); //out.write(result); }catch (Exception e) { System.out.println(e); System.exit(0); }//end catch } catch (LineUnavailableException ex) { ex.printStackTrace(); } //} catch (IOException ioe) { // ioe.printStackTrace(); //} } /** * Closes the target data line to finish capturing and recording */ void finish() { line.stop(); line.close(); System.out.println("Finished"); } /** * Entry to run the program */ public static void main(String[] args) { final JavaSoundRecorder recorder = new JavaSoundRecorder(); // creates a new thread that waits for a specified // of time before stopping Thread stopper = new Thread(new Runnable() { public void run() { try { Thread.sleep(RECORD_TIME); } catch (InterruptedException ex) { ex.printStackTrace(); } recorder.finish(); } }); stopper.start(); // start recording recorder.start(); } }

Salve sto provando a scrivere la parte di codice java per bufferizzare l'audio stream preso da microfono.
Mi spiego meglio, l'applicazione con un Thread rimane in attesa per 5 secondi.
Durante questi 5 secondi il processo JavaSoundRecorder parte, solo dopo trascorsi i secondi verrà terminato di fatto uscendo dal ciclo e chiudendo la comunicazione con il microfono.
Il processo dopo aver ottenuto "una linea microfono" cattura l'audio. Finchè il microfono e quindi la sua linea è aperta, leggo 10000 bytes e tento di stampare a video questi byte
byte tempBuffer[] = new byte[10000]; int cnt = line.read(tempBuffer,0,tempBuffer.length); System.out.print("letti:"+Arrays.toString(tempBuffer));

devo prima sapere la lunghezza dello stream dal mic, quindi devo bufferizzare. Pertanto creo ByteArrayOutputStream e scrivo dentro ogni chunk di 10000 bytes.
Infine prima di poter provare a inviarlo su socket salvo tutto su file wav.
 
codice.JPG
 
  • Like
Reactions: zabitmrw
Stato
Chiusa ad ulteriori risposte.

Discussioni simili