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;
       }
}


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