2016-12-25 1 views
1

Je récupère des octets à partir de InputStream, mais je dois les modifier et les enregistrer dans un fichier Wav.AudioSystem Write, AudioInputStream à partir d'octets modifiés obtenus à partir de InputStream, Java

Voici mon code:

Prise audio Envoi Obtenus à partir du microphone.

AudioFormat adfmt = new AudioFormat(8000.0f, 8, 1, true , true); 
int bufferSize = (int) adfmt.getSampleRate()* adfmt.getFrameSize(); 
byte[] buffer = new byte[bufferSize]; 
Socket clientSocketO = new Socket(...); 
OutputStream output = clientSocketO.getOutputStream(); 

DataLine.Info dlInfo = new DataLine.Info(TargetDataLine.class, adfmt); 
TargetDataLine tdLine = (TargetDataLine) AudioSystem.getLine(dlInfo); 
tdLine.open(adfmt); 
tdLine.start(); // start capturing 

boolean bRunningO = true; 
while (bRunningO) { 
    int count = tdLine.read(buffer, 0, buffer.length); 
    if (count > 0) { 
     byte[] outgoingBytes = Arrays.copyOf(buffer, count); 
     output.write(outgoingBytes); 
    } 
} 
tdLine.flush(); 

Dans l'autre côté Socket octets de réception:

AudioFormat adfmt = new AudioFormat(8000.0f, 8, 1, true , true); 
int bufferSize = (int) adfmt.getSampleRate()* adfmt.getFrameSize(); 
byte[] buffer = new byte[bufferSize]; 
Socket clientSocketI = new Socket(...); 
InputStream input = clientSocketI.getInputStream(); 
String fileName = System.getProperty("file.separator") + "SomeFile.wav" 
File fileStreamedWav = new File((new File("")).getAbsolutePath() + fileName); 
AudioInputStream ais; 
ByteArrayInputStream bis; 
DataLine.Info dlInfo = new DataLine.Info(SourceDataLine.class, adfmt); 
//SourceDataLine sdLine = (SourceDataLine) AudioSystem.getLine(dlInfo); 
//sdLine.open(adfmt); 
//sdLine.start(); // start playback 

AudioFileFormat.Type afType = AudioFileFormat.Type.WAVE; 
boolean bRunningI = true; 
while (bRunningI) { 
    try { 
     int read = input.read(buffer); //Socket Reading bytes 
     byte[] incomingBytes; 
     if (read > 0) { 
      incomingBytes = Arrays.copyOf(buffer, read); 
      if (incomingBytes!= null) { 
       //sdLine.write(incomingBytes, 0, incomingBytes.length); 

       //Same Size bytes, but isn't necessary submit the put Code 
       byte[] changedBytes = MethodChangerBytes(incomingBytes); 
       bis = new ByteArrayInputStream(changedBytes); 
       ais = new AudioInputStream(bis, adfmt, 
        changedBytes.length/adfmt.getFrameSize()); 
       int W = AudioSystem.write(ais, afType, fileStreamedWav); 
       System.out.println("AudioSystem.write:" + W); 
      } 
     } 
    } catch (IOException e) { 
     bRunningI = false; 
    } 
} 

Ici le modificateur de code d'octets, pour l'instant supposer amplifient par deux ...

byte[] MethodChangerBytes(byte[] incoming) { 
    byte[] outgoing = new byte[incoming.length]; 
    for (int i = 0; i < incoming.length; i ++) { 
     // Really is not important what happens here 
     double Sample = (double)(short)(((incoming[i] - 128) & 0xFF) << 8); 
     Sample *= 2.0; 
     outgoing[i] = (byte)(((int()Sample >> 8) + 128) & 0xFF); 
    } 
    return outgoing; 
} 

Quand est-sdLine décommentée alors Je peux ici tout son transmis.

AudioInputStream (flux InputStream, format AudioFormat, longue durée)

AudioSystem.write (flux AudioInputStream, AudioFileFormat.Type typeFichier, Limer)

Le problème:

Ce code seulement Enregistrez les derniers octets obtenus à partir de MethodChangerBytes.

Question:

Comment Enregistrer tous les octets traités octets Wav jusqu'à ce qu'une connexion socket est fermée?

Merci

Répondre

1

Avoir un tampon:

ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); 

écrire à ce tampon puis déplacez l'écriture en dehors de la boucle; lorsque tous les octets sont lus enregistrer:

boolean bRunningI = true; 
try { 
while (bRunningI) { 
    int read = input.read(buffer); //Socket Reading bytes 
    byte[] incomingBytes; 
    if (read > 0) { 
     incomingBytes = Arrays.copyOf(buffer, read); 
     if (incomingBytes!= null) { 
      //sdLine.write(incomingBytes, 0, incomingBytes.length); 

      //Same Size bytes, but isn't necessary submit the put Code 
      byte[] changedBytes = MethodChangerBytes(incomingBytes); 
      outputStream.write(changedBytes, 0, changedBytes.length); 
     } 
    } 
} 
byte[] allBytes=outputStream.toByteArray(); 
bis = new ByteArrayInputStream(allBytes); 
ais = new AudioInputStream(bis, adfmt, 
       changedBytes.length/adfmt.getFrameSize()); 
int W = AudioSystem.write(ais, afType, fileStreamedWav); 
System.out.println("AudioSystem.write:" + W); 
} catch (IOException e) { 
    bRunningI = false; 
}