我有一些代码从麦克风获取输入,将其保存为.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 :(得分:0)
为什么不尝试发送字节?
byte[] content = Files.readAllBytes(f.toPath);
oos.writeObject(content);
byte[] content = (byte[]) ois.readObject();
Files.write(f.toPath(), content);
答案 1 :(得分:0)
这里的问题也可能出在你的tempBuffer []上。后者的大小应与您发送/接收的文件大小相同。您可以动态指定tempBuffer []的大小:
byte [] tempBuffer = new byte [(int)wavFile.length()];