socket播放音频

package client;
//import java.io.BufferedReader;
//import java.io.ByteArrayInputStream;
//import java.io.DataInputStream;
//import java.io.DataOutputStream;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
//import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
public class Client {
    public static void main(String[] args) throws Exception, Exception {
        // 链接sever端
        Socket s1 = new Socket("192.168.137.10", 8080);
        System.out.println("连接成功");
        // 实例化输入流
        //DataInputStream dis = new DataInputStream(s1.getInputStream());
        InputStream dis = s1.getInputStream();
        // 实例化输出流
        //DataOutputStream dos = new DataOutputStream(s1.getOutputStream());
        OutputStream dos = s1.getOutputStream();
        // 实例化两个进程
//      Thread mcr = new ClientRead(dis);
//      音频接受线程
        Thread mcw = new ClientWrite(dos);
        new Playback(s1).start();
        new SaveFile(dis).start();
        System.out.println("线程创建成功");
        // 启动两个进程
//      mcr.start();
        mcw.start();
    }
}
// 创建一个线程用来进行接收读取数据
class ClientRead extends Thread {
    private InputStream dis;
    public ClientRead(InputStream dis) {
        this.dis = dis;
    }
    public void run() {
//      String msg;
        byte[] voice = new byte[80000];
        System.out.println("数组创建成功");
          
        try {
            while (dis.read(voice) < 80000){
                System.out.println("收到数据");
            }
            System.out.println("开始输出");
            for(int count=0;count<=70;count++)
            {
                System.out.println((byte)voice[count]);
            }
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
                  
    }
}
// 创建一个进程用来写入并发送数据
class ClientWrite extends Thread {
    private OutputStream dos;
    public ClientWrite(OutputStream dos) {
        this.dos = dos;
    }
    @Override
    public void run() {
        //BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        byte[] instruction=new byte[2];
        instruction[0]=(byte)0x67;
        instruction[1]=(byte)0x82;
        try {
//          System.in.read(instruction);
//          System.out.println(instruction);
            dos.write(instruction);
            System.out.println("发送成功");
              
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }      
        //InputStream start = new ByteArrayInputStream(instruction);
//      String msg;
          
    }
}
/**
* Title:        VoiceChat
* Description: 输出音频(放音程序)
* Copyright:    Copyright (c) 2001
* Company:
* @author       
* @version 1.0
* 步骤:
* 首先读取网络数据流到byte,新建line音频管线,用line的write方法将视频流输出到混频器
* 目前存在问题:1.噪音较大。2.声音不连贯,时断时续
*
*/
class Playback implements Runnable {
       final int bufSize = 16384;
       SourceDataLine line;
       Thread thread;
       Socket s;
       Playback(Socket s){//构造器 取得socket以获得网络输入流
         this.s=s;
       }
       public void start() {
           thread = new Thread(this);
           thread.setName("Playback");
           thread.start();
       }
       public void stop() {
           thread = null;
       }
       public void run() {
             
//         AudioFormat format =new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,8000.0f,8,1,1,8000.0f,false);//AudioFormat(float sampleRate, int sampleSizeInBits, int channels, boolean signed, boolean bigEndian)
           AudioFormat format =new AudioFormat(8000.0f,8,1,true,false);
           BufferedInputStream playbackInputStream;
           //获取音频流
           try {
//               ByteArrayInputStream bin=new ByteArrayInputStream(null);
//               bin.read
               playbackInputStream=new BufferedInputStream(new AudioInputStream(s.getInputStream(),format,800000000));//封装成音频输出流
           }
           catch (IOException ex) {
               return;
           }
             
             
           DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);//line音频管道信息
           try {
               line = (SourceDataLine) AudioSystem.getLine(info);
               line.open(format, bufSize); //打开管道
           } catch (LineUnavailableException ex) {
               return;
           }
             
           byte[] data = new byte[3752];//
           int numBytesRead = 0;
           line.start();
           while (thread != null) {
              try{
                 numBytesRead = playbackInputStream.read(data);
                 int count=line.write(data, 0,numBytesRead);
                 System.out.println(count);
              } catch (IOException e) {
                   break;
               }
           }
           if (thread != null) {
               line.drain();
           }
           line.stop();
           line.close();
           line = null;
       }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章