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