0

我有一些从麦克风获取输入的代码,将其保存为.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();
     }

 }


        } 
4

2 回答 2

0

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

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

byte[] content = (byte[]) ois.readObject();  
Files.write(f.toPath(), content);
于 2013-03-30T03:25:17.757 回答
0

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

字节 [] tempBuffer = 新字节 [(int)wavFile.length()];

于 2013-03-30T03:41:20.387 回答