import java.io.*;

import javax.sound.sampled.*;

import java.net.*;

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(8000,16,2,true,true);//AudioFormat(float sampleRate, int sampleSizeInBits, int channels, boolean signed, boolean bigEndian)

BufferedInputStream playbackInputStream;

try {

playbackInputStream=new BufferedInputStream(new AudioInputStream(s.getInputStream(),format,2147483647));//封装成音频输出流,如果网络流是经过压缩的需在此加套解压流

}

catch (IOException ex) {

return;

}

DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);

try {

line = (SourceDataLine) AudioSystem.getLine(info);

line.open(format, bufSize);

} catch (LineUnavailableException ex) {

return;

}

byte[] data = new byte[1024];//此处数组的大小跟实时性关系不大,可根据情况进行调整

int numBytesRead = 0;

line.start();

while (thread != null) {

try{

numBytesRead = playbackInputStream.read(data);

line.write(data, 0,numBytesRead);

} catch (IOException e) {

break;

}

}

if (thread != null) {

line.drain();

}

line.stop();

line.close();

line = null;

}

}

//音频捕获部分,

import java.io.*;

import javax.sound.sampled.*;

import java.net.*;

/**

* Title:        VoiceChat

* Description:  音频捕捉(录音程序)

* Copyright:    Copyright (c) 2001

*/

class Capture implements Runnable {

TargetDataLine line;

Thread thread;

Socket s;

BufferedOutputStream captrueOutputStream;

Capture(Socket s){//构造器 取得socket以获得网络输出流

this.s=s;

}

public void start() {

thread = new Thread(this);

thread.setName("Capture");

thread.start();

}

public void stop() {

thread = null;

}

public void run() {

try {

captrueOutputStream=new BufferedOutputStream(s.getOutputStream());//建立输出流 此处可以加套压缩流用来压缩数据

}

catch (IOException ex) {

return;

}

AudioFormat format =new AudioFormat(8000,16,2,true,true);//AudioFormat(float sampleRate, int sampleSizeInBits, int channels, boolean signed, boolean bigEndian)

DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);

try {

line = (TargetDataLine) AudioSystem.getLine(info);

line.open(format, line.getBufferSize());

} catch (Exception ex) {

return;

}

byte[] data = new byte[1024];//此处的1024可以情况进行调整,应跟下面的1024应保持一致

int numBytesRead=0;

line.start();

while (thread != null) {

numBytesRead = line.read(data, 0,128);//取数据(1024)的大小直接关系到传输的速度,一般越小越快,

try {

captrueOutputStream.write(data, 0, numBytesRead);//写入网络流

}

catch (Exception ex) {

break;

}

}

line.stop();

line.close();

line = null;

try {                captrueOutputStream.flush();                captrueOutputStream.close();            } catch (IOException ex) {                ex.printStackTrace();            }        }      }

java实现语音聊天_java 语音聊天核心代码相关推荐

  1. java并发 cpu高_java高并发核心要点|系列5|CPU内存伪共享

    上节提到的:伪共享,今天我们来说说. 那什么是伪共享呢? 这得从CPU的缓存结构说起.以下如图,CPU一般来说是有三级缓存,1 级,2级,3级,越上面的,越靠近CPU的,速度越快,成本也越高.也就是说 ...

  2. JAVA里tokens意思_Java TokenMetadata.sortedTokens方法代码示例

    import org.apache.cassandra.locator.TokenMetadata; //导入方法依赖的package包/类 /** * Get the "primary r ...

  3. java 实现自旋锁_java自旋锁的代码实现

    自旋锁:spinlock 是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环好用CPU 代码: import java.util.concur ...

  4. java构造函数重载继承_Java基础-继承 - 写代码换盆的个人空间 - OSCHINA - 中文开源技术交流社区...

    访问权限 Java 中有三个访问权限修饰符:private.protected 以及 public,如果不加访问修饰符,表示包级可见. 可以对类或类中的成员(字段和方法)加上访问修饰符. 类可见表示其 ...

  5. java二重循环计数_java的二重循环代码样例

    1.计算三个班的平均分 import java.util.Scanner; public class AvgScore{ public static void main (Sting[] args){ ...

  6. java 自定义登录态_java – 自定义HTTP状态代码

    我考虑在一个项目中使用fluent-http. 我从一个简单的"登录/密码"页面开始.我用字段登录名和密码创建一个简单的POJO: public class LoginReques ...

  7. java实现qq抢红包_java实现 pta 抢红包代码

    pta 抢红包代码 java实现pta抢红包代码,因为超时,没有办法跑完所有测试,只能拿到19分. import java.util.ArrayList; import java.util.Array ...

  8. java 编码 正弦计算器_Java 简单功能计算器代码

    带界面的计算机: JAVA编写. package com.ALiangJie.Calculator; import javax.swing.*; import java.awt.*; import j ...

  9. java gui构造工具_Java Web框架 静态代码块、构造代码块、构造函数、普通代码块 执行顺序 Decompiler JD-GUI 反编译工具...

    1.下载jd-gui-windows-1.4.0. http://jd.benow.ca/ 2.通过jd-gui.exe查看.class文件,用于分析类编译过程. 3.源文件. // 加载相应的 He ...

最新文章

  1. python元组(tuple)使用示例+常用方法+列表(list)和元组(tuple)的异同?
  2. Java中的锁[原理、锁优化、CAS、AQS]
  3. Codeforces Round #506 (Div. 3) - F. Multicolored Markers (思维)
  4. 如何确保sublime text每次启动时不会自动打开以前打开的文档
  5. java调用c的sdk_如何使用java调用c++的sdk动态库 sdk已存在 java方法怎么写? 怎么调用??在线等!!!...
  6. zbrush 添加纹理贴图_想学习3D游戏模型,3Dmax、MAYA和ZBrush都需要掌握吗?
  7. 树:二叉树的非递归遍历算法
  8. 共享单车变身“行走的弹幕”,清华大学等17所高校均有投放
  9. 几个有趣的Javascript Hack
  10. matlab 仿真光学实验报告,光学信息处理实验的Matlab仿真.doc
  11. 理性讨论: 《崩坏3》是不是目前打击感最好的动作手游?
  12. oracle dbms_lob trim,DBMS_LOB
  13. 推荐系统入门实践:世纪佳缘会员推荐(完整版)
  14. 【svn】svn的Replacing来历及解决办法
  15. 工匠精神消失的手机2020:衰落、变局、绝唱、破圈
  16. 取消键盘Fn功能键方式
  17. 计算机网络基础:OSI模型与TCP/IP协议的关系
  18. ai作文批改_作文批改功能,AI,你可以在批改记录中看到自己每次的进步
  19. Qt 窗口置顶与取消
  20. 2022云南最新道路运输安全员考试题库及答案

热门文章

  1. 【Matlab】private文件夹
  2. 数据产品-数据可视化工具Excel
  3. 数学 - 线性代数导论 - #10 线性相关性、向量空间的基和维数
  4. canvas学习-----1px线条模糊问题
  5. android 上线流程
  6. ThinkPHP 3.1 404页面的设置
  7. 五年后的4.20地震
  8. 关于索爱MT15i连接win7——MTP USB驱动无法安装
  9. Android实现分享代码,Android 分享功能的实现代码
  10. taxtable java_C语言计算个人所得税问题代码及解析