gpt4 book ai didi

java - 停止录制声音 - Java

转载 作者:太空宇宙 更新时间:2023-11-04 15:02:24 25 4
gpt4 key购买 nike

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

这里是:

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);
}

}
}

最佳答案

据我所知,您上面的实现缺少代码的主要部分。您似乎正在捕获该行(我还没有尝试运行或调试上面的内容),但没有任何内容显示您实际从该行读取数据的位置!

如果您查阅 Java 教程中的示例,教程“捕获音频”中标题为 Reading the Data from the TargetDataLine 的部分显示此过程的代码。请注意 boolean 值“!stopped”的使用。该 boolean 值可用于停止从外部线程读取的 while 循环,例如按下按钮的结果。为了获得最佳性能, boolean 值应指定为 volatile 的,并提供一个公共(public)方法,允许您将其值设置为“false”。

关于java - 停止录制声音 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22428205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com