停止录音-Java

停止录音-Java,java,audio,Java,Audio,当我点击“控制台停止”时,我编写的代码不会停止录制。我不明白我做错了什么。你能看一下下面的代码并指出我的错误在哪里吗 这是: import java.io.File; import java.io.IOException; import java.util.Scanner; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.

当我点击“控制台停止”时,我编写的代码不会停止录制。我不明白我做错了什么。你能看一下下面的代码并指出我的错误在哪里吗

这是:

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;

public class Main {

    final static int MONO = 1;
    private static AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;

    public static void main(String[] args) {
        AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                16000, 16, MONO, 2, 16000, true);
        DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
        int numb = 1;
        String files = "C:\\test\\music\\lala" + numb + "." + fileType;
        File fileOut = new File(files);

        if (!AudioSystem.isLineSupported(info)) {
            System.out.println("Line nit supporot!");
        }
        System.out.println("To stop recording a sound lead - stop");
        Scanner sc = new Scanner(System.in);
        String scc;
        TargetDataLine mike = null;
        try {
            mike = (TargetDataLine) AudioSystem.getLine(info);
            mike.open(format);
            AudioInputStream sound = new AudioInputStream(mike);
            mike.start();
            AudioSystem.write(sound, fileType, fileOut);

            scc = sc.nextLine();
            if (scc.equals("stop")) {
                System.out.println("recording is stopped!");
                mike.stop();
                sound.close();
                System.exit(0);
            }
        } catch (LineUnavailableException e) {
            System.out.println("line not avaible");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
它不起作用:

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;

public class Main implements Runnable {

    final static int MONO = 1;
    private static AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
    private static TargetDataLine mike;
    private static AudioInputStream sound;

    public static void main(String[] args) {
        AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                16000, 16, MONO, 2, 16000, true);
        DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
        int numb = 1;
        String files = "C:\\test\\music\\lala" + numb + "." + fileType;
        File fileOut = new File(files);

        if (!AudioSystem.isLineSupported(info)) {
            System.out.println("Line nit supporot!");
        }
        System.out.println("Для остановки записи звука введите - g");
        try {
            mike = (TargetDataLine) AudioSystem.getLine(info);
            mike.open(format);
            sound = new AudioInputStream(mike);
            mike.start();
            AudioSystem.write(sound, fileType, fileOut);

        } catch (LineUnavailableException e) {
            System.out.println("line not avaible");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void run() {
        Scanner sc = new Scanner(System.in);
        String scc;

        scc = sc.nextLine();
        if (scc.equals("g")) {
            System.out.println("Запись звука остановлена");
            mike.stop();
            try {
                sound.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.exit(0);
        }

    }
}

就sI所见,上面的实现缺少一大部分代码。您似乎正在捕获该行(我没有尝试运行或调试上述内容),但没有显示您实际从该行读取数据的位置


如果您参考Java教程中的示例,教程中标题为“捕获音频”的部分将显示此过程的代码。注意布尔值“!stopped”的用法。此布尔值可用于停止while循环,以便从外部线程读取数据,例如按下按钮的结果。为获得最佳性能,布尔值应指定为volatile,并提供一个公共方法,允许您将其值设置为“false”。

我想,也许您需要一个线程。erstwhileii,谢谢)parsa porahmad,老实说,在线程中我不太了解)我不知道音频api是否创建了线程。但是,假设您应该等待user stop命令并同时录制声音,那么您需要同时做两件事,因此您需要一个用于录制声音的线程和一个用于用户命令的线程。因此,如果它起作用,我会感到惊讶,您还没有启动线程,您需要启动线程
新线程(this).start()
,试一试