有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

通过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) 个答案