用java录音获得巨大的回声

问题描述

我在用 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 (将#修改为@)