问题描述
我在用 java sound api 录音时得到了巨大的回声。但我希望录音没有任何回声。我怎样才能做到这一点 ?或者我的以下两个课程可能有什么问题??
Recorder.java
package media;
import javax.sound.sampled.*;
public class Recorder extends Thread{
public static final int DEFAULT_AUdio_RECORD_FRAME_DURATION = 60; /// 60ms
private TargetDataLine line;
private boolean running;
public Recorder(){
super();
}
@Override
public void run(){
running = true;
try {
AudioFormat format = new AudioFormat(16000,16,1,true,false);
DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);
// checks if system supports the data line
if (!AudioSystem.isLinesupported(info)) {
System.exit(0);
}
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start(); // start capturing
AudioInputStream ais = new AudioInputStream(line);
byte [] data = new byte[1960]; /////frame size 1960. 60 ms data
int readLen;
int sequenceNumber = 0;
try {
while (running) {
readLen = ais.read(data);
if(readLen <= 0) {
break;
}
processEncodingAndSendToServer(data);
}
} catch (Exception e) {
e.printstacktrace();
}
}catch (Exception e){
e.printstacktrace();
}finally {
try{
line.stop();
}catch (Exception e){}
try{
line.close();
}catch (Exception e){}
}
}
public void shutDown(){
running = false;
}
}
Player.java
package media;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.sourceDataLine;
public class Player extends Thread{
private boolean running;
public Player(){
super();
}
@Override
public void run(){
int readLen;
running = true;
SourceDataLine sline = null;
int sequenceNumber = 0;
try{
AudioFormat format = new AudioFormat(16000,false);
byte [] data = new byte[1960];
DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);
sline = (SourceDataLine) AudioSystem.getLine(info);
sline.open(format);
sline.start(); // start capturing
while(running){
readLen = getPacketForPlay(data,0); ////get a packet of length 1960 after deocoding which is received from server
if(readLen <= 0) {
continue;
}
sline.write(data,readLen);
}
}catch (Exception e){
e.printstacktrace();
}finally {
try {
sline.stop();
sline.close();
}catch (Exception e){}
}
}
public void shutDown(){
running = false;
this.interrupt();
}
}
上述两个类是在这个会议应用程序运行时独立运行的简单线程。即使在两个人的谈话中,我也得到了巨大的回声。并且随着通话的人越多,这个问题就越严重。奇怪的是,即使连接了耳机的电脑也会出现这个问题。我确定我的代码在这里犯了一些错误。迫切需要一些帮助。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)