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; } }
socket播放音頻
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.