请问用JAVA怎样捕获音频输出数据?

Gongzt 2010-02-05 08:23:23
我现在在做毕业设计,要远程控制一台电脑。屏幕显示和控制部分应该很容易就能弄好。可是现在要把一台电脑的声音传到另一台电脑那里,我看过好多资料都只是捕获音频输入设备的数据,问题是我要把整个系统的声音都传到另外一台电脑那里。通过JAVA可以实现吗?
...全文
349 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nihuajie05 2010-02-09
  • 打赏
  • 举报
回复
捕捉系统输出啊。。。这个有点难吧
hy158753228 2010-02-08
  • 打赏
  • 举报
回复
mark先!
洗了再细看!
Gongzt 2010-02-08
  • 打赏
  • 举报
回复
引用 7 楼 preferme 的回复:
屏幕显示和控制部分 楼主能给个提示么 ?我咋觉得很困难呢 ?

楼主提的问题,理论上是可行的,但要通过网络传输,可能要用到压缩技术吧。

我也没接触过这方面的内容,楼主查查,应该有相关开源的项目,可以借用一下的。

楼上几位给出的代码,具体我也没看,估计是播放音频文件的代码,应该不太适应楼主的英勇环境吧 ?

毕竟,音频文件的大小是固定的,但,即时通话的时间是不固定的。

当然,也可能人家提供的程序也支持。我就不多嘴了。


屏幕显示和控制方面可以用VNC的rfb协议来实现,网上也有很多开源的客户端软件吧。。不过我是实现客户端的,所以比较简单。。。希望能帮到你?
冰思雨 2010-02-06
  • 打赏
  • 举报
回复
屏幕显示和控制部分 楼主能给个提示么 ?我咋觉得很困难呢 ?

楼主提的问题,理论上是可行的,但要通过网络传输,可能要用到压缩技术吧。

我也没接触过这方面的内容,楼主查查,应该有相关开源的项目,可以借用一下的。

楼上几位给出的代码,具体我也没看,估计是播放音频文件的代码,应该不太适应楼主的英勇环境吧 ?

毕竟,音频文件的大小是固定的,但,即时通话的时间是不固定的。

当然,也可能人家提供的程序也支持。我就不多嘴了。
wswzwz 2010-02-05
  • 打赏
  • 举报
回复
没声音啊,怎么用的
bobo364 2010-02-05
  • 打赏
  • 举报
回复

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


honggu025 2010-02-05
  • 打赏
  • 举报
回复
mark
yueguangkai001 2010-02-05
  • 打赏
  • 举报
回复
关注
呼吸先生 2010-02-05
  • 打赏
  • 举报
回复
UP 没遇到过此类问题。。
Gongzt 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bobo364 的回复:]
Java codeimport java.io.*;import javax.sound.sampled.*;import java.net.*;/**
* Title: VoiceChat
* Description: 输出音频(放音程序)
* Copyright: Copyright (c) 2001
* Company:
*@author 网络
*@version 1.0*/class Playbackimplements Runnable {finalint bufSize=16384;
SourceDataLine line;
Thread thread;
Socket s;

Playback(Socket s){//构造器 取得socket以获得网络输入流this.s=s;
}publicvoid start() {

thread=new Thread(this);
thread.setName("Playback");
thread.start();
}publicvoid stop() {
thread=null;
}publicvoid 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=newbyte[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 Captureimplements Runnable {

TargetDataLine line;
Thread thread;
Socket s;
BufferedOutputStream captrueOutputStream;

Capture(Socket s){//构造器 取得socket以获得网络输出流this.s=s;
}publicvoid start() {

thread=new Thread(this);
thread.setName("Capture");
thread.start();
}publicvoid stop() {
thread=null;
}publicvoid 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(TargetDataLineTargetDataLine.class,format);try {
line= (TargetDataLine) AudioSystem.getLine(info);
line.open(format, line.getBufferSize());
}catch (Exception ex) {return;
}byte[] data=newbyte[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();
}
}
}
[/Quote]

可是你这里的TARGETDATALINE还是从输入设备那里获得数据啊。。。我想要的是捕获系统输出的声音。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧