请问用JAVA怎样捕获音频输出数据? 我现在在做毕业设计,要远程控制一台电脑。屏幕显示和控制部分应该很容易就能弄好。可是现在要把一台电脑的声音传到另一台电脑那里,我看过好多资料都只是捕获音频输入设备的数据,问题是我要把整个系统的声音都传到另外一台电脑那里。通过JAVA可以实现吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import java.io.*; import javax.sound.sampled.*; import java.net.*;/** * Title: VoiceChat * Description: 输出音频(放音程序) * Copyright: Copyright (c) 2001 * Company: * @author 网络* @version 1.0 */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 * Company: * @author 网络* @version 1.0 */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,1024);//取数据(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(); } } } 可是你这里的TARGETDATALINE还是从输入设备那里获得数据啊我想要的是捕获系统输出的声音。 屏幕显示和控制方面可以用VNC的rfb协议来实现,网上也有很多开源的客户端软件吧。。不过我是实现客户端的,所以比较简单希望能帮到你? java基础的一个小疑惑 求java软件开发实例 成员变量的隐藏和方法的重写有什么用??? 请问Swing做QQ弹出消息的问题 如何理解Class c = int.class; 为什么比较时有人推荐 0==len ,要把常量放在前面,作为第一操作数 请问构造函数可否递归调用?? 请问java的哪个平台好,是sun的java,还是微软的j++? java多线程模拟服务器和客户端聊天 java快速查询海量数据并进行对比然后将对比结果重新写入到文本文件 不用数据库,怎么实现数据读写。 高性能问题:大表进行数据水平切分后...
import java.io.*;
import javax.sound.sampled.*;
import java.net.*;
/**
* Title: VoiceChat
* Description: 输出音频(放音程序)
* Copyright: Copyright (c) 2001
* Company:
* @author 网络
* @version 1.0
*/
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
* Company:
* @author 网络
* @version 1.0
*/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,1024);//取数据(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();
}
}
}
可是你这里的TARGETDATALINE还是从输入设备那里获得数据啊我想要的是捕获系统输出的声音。
屏幕显示和控制方面可以用VNC的rfb协议来实现,网上也有很多开源的客户端软件吧。。不过我是实现客户端的,所以比较简单希望能帮到你?