2013-03-30 31 views
0

我有一些代码从麦克风获取输入,将其保存为.wav文件并将其发送到服务器。在服务器端,会收到.wav文件。现在,我希望修改它,以便客户端应该能够发送多个.wav文件,并且服务器应该接收它们并将它们全部存储在缓冲区中。请帮帮我。在客户端如何从客户端发送多个.wav文件到服务器

代码如下:

`import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.lang.*; 
import java.net.*; 

import javax.sound.sampled.*; 

public class AudioRecorder extends JFrame 
{ 

public final static int DEF_PORT=9; 
public final static int MAX_SIZE=65507; 
public static int flag=0; 

boolean stopCapture = false; 
ByteArrayOutputStream byteArrayOutputStream; 
AudioFormat audioFormat; 
TargetDataLine targetDataLine; 
AudioInputStream audioInputStream; 
SourceDataLine sourceDataLine; 



    //creating file 

File file=new File("chat.wav"); 
FileOutputStream fout; 

AudioFileFormat.Type fileType; 

public AudioRecorder(){//constructor 
try 
{ 
    fout=new FileOutputStream(file); 
} 
catch (FileNotFoundException e1) 
{ 
    e1.printStackTrace(); 
} 

    //button play,stop, capture 

final JButton captureBtn = new JButton("Capture"); 
final JButton stopBtn = new JButton("Stop"); 
    final JButton playBtn = new JButton("Save"); 

    captureBtn.setEnabled(true); 
    stopBtn.setEnabled(false); 
    playBtn.setEnabled(false); 

    captureBtn.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
{ 
     captureBtn.setEnabled(false); 
     stopBtn.setEnabled(true); 
     playBtn.setEnabled(false); 
     captureAudio(); 
    } 
    }); 

getContentPane().add(captureBtn); 

    stopBtn.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
{ 
     captureBtn.setEnabled(true); 
     stopBtn.setEnabled(false); 
     playBtn.setEnabled(true); 

     //Terminate the capturing of input data from the microphone. 

     stopCapture = true; 
    }//end actionPerformed 
    }//end ActionListener 
    );//end addActionListener() 

    getContentPane().add(stopBtn); 

    playBtn.addActionListener(new ActionListener() 
{ 
     public void actionPerformed(ActionEvent e) 
    { 
     //Play back all of the data that was saved during capture. 
     saveAudio(); 
     }//end actionPerformed 
    }//end ActionListener 
    );//end addActionListener() 

getContentPane().add(playBtn); 

    getContentPane().setLayout(new FlowLayout()); 
    setTitle("Capture/Playback Demo"); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setSize(250,70); 
    setVisible(true); 

}//end constructor 


    //This method captures audio input from a microphone and saves it in a ByteStreamObject         
private void captureAudio() 
{ 
     try{ 
    //Get everything set up for capture 
      audioFormat = getAudioFormat(); 
      DataLine.Info dataLineInfo = new   DataLine.Info(TargetDataLine.class,audioFormat); 
      targetDataLine = (TargetDataLine) 
       AudioSystem.getLine(dataLineInfo); 
      targetDataLine.open(audioFormat); 
      targetDataLine.start(); 

    //Create a thread to capture the microphone data and start it running. It will run until the Stop button is clicked. 
      Thread captureThread = new Thread(new CaptureThread()); 
      captureThread.start(); 
      } 
     catch (Exception e) 
     { 
      System.out.println(e); 
      System.exit(0); 
      }//end catch 
}//end captureAudio method 


    //This method plays back the audio data that has been saved in the ByteArrayOutputStream 
private void saveAudio() 
{ 
    try 
{ 
    //Get everything set up for playback. Get the previously-saved data into a byte array object. 
    byte audioData[] = byteArrayOutputStream.toByteArray(); 
    //Get an input stream on the byte array containing the data 
    InputStream byteArrayInputStream = new ByteArrayInputStream(audioData); 
    AudioFormat audioFormat = getAudioFormat(); 
    audioInputStream = new AudioInputStream(byteArrayInputStream,audioFormat,audioData.length/audioFormat.getFrameSize()); 
    DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,audioFormat); 
    sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo); 
    sourceDataLine.open(audioFormat); 
    sourceDataLine.start(); 
//flag=1; 

    //Create a thread to play back the data and start it running. It will run until all the data has been played back. 
    Thread saveThread = new Thread(new SaveThread()); 
    saveThread.start(); 
saveThread.join(); 



    try{   

     InetAddress server=InetAddress.getByName("127.0.0.1"); 
     Socket soc = new Socket(server, 8020);  
     FileInputStream fis = new FileInputStream("chat.wav"); 
     byte[] buffer = new byte[fis.available()]; 
     fis.read(buffer); 
     ObjectOutputStream oos = new ObjectOutputStream(soc.getOutputStream()) ; 
     oos.writeObject(buffer); 


    } 
    catch(Exception e) 
    { 
     System.out.println("Error : "+e); 
    } 


//function to record and save audio file 




    } 
catch (Exception e) 
{ 
     System.out.println(e); 
     System.exit(0); 
    }//end catch 
}//end playAudio 


    //This method creates and returns an AudioFormat object for a given set of format parameters. 
    //If these parameters don't work well for you, try some of the other alowable parameter values, which are shown in comments //following the declarations. 

private AudioFormat getAudioFormat() 
{ 
     float sampleRate = 8000.0F; 
     //8000,11025,16000,22050,44100 
     int sampleSizeInBits = 16; 
     //8,16 
     int channels = 1; 
     //1,2 
     boolean signed = true; 
     //true,false 
     boolean bigEndian = false; 
     //true,false 
     return new AudioFormat(sampleRate,sampleSizeInBits,channels,signed,bigEndian); 
}//end getAudioFormat 
    //===================================// 

    //Inner class to capture data from microphone 

    class CaptureThread extends Thread 
    { 
      //An arbitrary-size temporary holding buffer 

     byte tempBuffer[] = new byte[10000]; 

     public void run(){ 
      byteArrayOutputStream = new ByteArrayOutputStream(); 
      stopCapture = false; 
      try{//Loop until stopCapture is set by another thread that services the Stop button. 

     while(!stopCapture){ 
     //Read data from the internal buffer of the data line. 
     int cnt = targetDataLine.read(tempBuffer,0,tempBuffer.length); 
      if(cnt > 0){ 
     //Save data in output stream 
     // object. 
      byteArrayOutputStream.write(tempBuffer, 0, cnt); 

     }//end if 
     }//end while 
      byteArrayOutputStream.close(); 
     }catch (Exception e) { 
      System.out.println(e); 
     System.exit(0); 
     }//end catch 
     }//end run 
    }//end inner class CaptureThread 
    //===================================// 
     //Inner class to play back the data 
     // that was saved. 

    class SaveThread extends Thread{ 
     byte tempBuffer[] = new byte[10000]; 

     public void run(){ 
     try{ 
      int cnt; 
       //Keep looping until the input 
       // read method returns -1 for 
      // empty stream. 

       if (AudioSystem.isFileTypeSupported(AudioFileFormat.Type.AU,audioInputStream)) { 

       AudioSystem.write(audioInputStream, AudioFileFormat.Type.AU, file); 

      } 

      }catch (Exception e) { 
      System.out.println(e); 
      System.exit(0); 
      }//end catch 
     }//end run 
    }//end inner class PlayThread 
     //===================================// 

    public static void main(String args[]) 
     { 

      new AudioRecorder(); 


     }//end main 
    }//end outer class AudioCapture01.java 

代码在服务器端:

import java.lang.*; 
    import java.io.*; 
    import java.net.*; 




    public class MyServer 
    { 
public final static int DEF_PORT=9; 
public final static int MAX_SIZE=65507; 

public static void main(String args[]) 
{ 
    //byte[] buffer=new byte[100000]; 
    try 
    { 

     ServerSocket ser = new ServerSocket(8020); 
     Socket clientSocket = ser.accept(); 

      ObjectInputStream ois = new 

      ObjectInputStream(clientSocket.getInputStream()); 
     byte[] buffer = (byte[])ois.readObject(); 
     FileOutputStream fos = new 

      FileOutputStream("a1.wav"); 

     fos.write(buffer); 
      fos.close(); 




    } 

    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

} 


     } 
+0

对不起,有什么问题吗? – Taylor

+0

您应该尝试更好地设置您的代码的格式。如果你使用Eclipse,使用'CTRL-SHIFT-F'。试图帮助 – Jess

+0

@泰勒我希望客户端发送多个.wav文件到服务器。目前,它只发送一个文件。因为我对此很陌生,所以我不清楚如何去做。 –

回答

0

你为什么不尝试发送字节?

byte[] content = Files.readAllBytes(f.toPath); 
oos.writeObject(content); 

byte[] content = (byte[]) ois.readObject(); 
Files.write(f.toPath(), content); 
0

这里的问题也可能与您的tempBuffer []。后者的大小应与您发送/接收的文件大小相同。您可以动态指定tempBuffer []的大小,如下所示:

byte [] tempBuffer = new byte [(int)wavFile.length()];

相关问题