通过java录制获得巨大回声的音频
我在用java sound api录音时收到了巨大的回音。但我希望录音没有回声。我该怎么做?或者我下面的两门课有什么问题
记录器。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;
}
}
玩家。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, 16, 1, true, 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, 0 , readLen);
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
sline.stop();
sline.close();
}catch (Exception e){}
}
}
public void shutDown(){
running = false;
this.interrupt();
}
}
以上两个类是在运行此会议应用程序时独立运行的简单线程。即使在两个人的谈话中,我也得到了巨大的反响。而且这个问题更严重,因为有更多的人在打电话。奇怪的是,即使是连着耳机的电脑也会出现这个问题。我确信我在这里的代码中犯了一些错误。急需帮助
共 (0) 个答案