过去几周我一直在阅读Java Sound API,但我仍然无法弄清楚这是否可行。我问,因为我想编写一个程序,将声音数据传递到系统前往输出线,如我的计算机的扬声器或耳机插孔,并将该数据写入音频文件。
从我到目前为止所读到的关于javax.sound.sampled
的内容来看,似乎我只能通过Mixer
从TargetDataLine
读取数据;但是,在编写测试程序(在下面提供)后,查询我的系统中的可用混频器,然后查询这些混频器以获取可用的目标和源数据线;我实现了所有输出混音器,除了我的默认混音器只支持SourceDataLine
s。此外,我无法判断来自我的计算机默认混音器(我有Macbook pro)的TargetDataLine
是否可以读取从其他应用程序发送到混音器的音频数据。所以在我深入研究这个项目之前,我想弄清楚它是否可以访问其他应用程序通过混音器发送的声音。
import javax.sound.sampled.*;
import java.util.Scanner;
public class Capture {
public static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_GREEN = "\u001B[32m";
public static final String ANSI_RESET = "\u001B[m";
private Mixer mixer;
public Capture() {
Mixer.Info[] installedMixers = AudioSystem.getMixerInfo();
for(int n = 0; n < installedMixers.length; n++) {
System.out.println(ANSI_GREEN + "[" + n + "] " + ANSI_RESET + installedMixers[n].toString());
}
while(mixer == null) {
int choice;
try {
System.out.print("Choose a mixer: ");
Scanner s = new Scanner(System.in);
choice = s.nextInt();
if(choice >= 0 && choice < installedMixers.length)
mixer = AudioSystem.getMixer(installedMixers[choice]);
else
System.out.println(ANSI_RED + "Invalid Choice!" + ANSI_RESET);
} catch(RuntimeException e) {
System.out.println(ANSI_RED + "Please input an integer corresponding to your mixer choice." + ANSI_RESET);
}
}
System.out.println(ANSI_RED + "Source Lines:" + ANSI_RESET);
Line.Info[] sourceLines = mixer.getSourceLineInfo();
if(sourceLines.length == 0) {
System.out.println("None");
}
for(int n = 0; n < sourceLines.length; n++) {
System.out.println(ANSI_GREEN + "[" + n + "] " + ANSI_RESET + sourceLines[n].toString());
}
System.out.println(ANSI_RED + "Target Lines:" + ANSI_RESET);
Line.Info[] targetLines = mixer.getTargetLineInfo();
if(targetLines.length == 0) {
System.out.println("None");
}
for(int n = 0; n < targetLines.length; n++) {
System.out.println(ANSI_GREEN + "[" + n + "] " + ANSI_RESET + targetLines[n].toString());
}
}
public static void main(String[] args) {
Capture recording = new Capture();
}
}
P.S。我发现了另外两个与这个确切主题相关的问题,似乎根本没有提供解决方案。 One从未得到过答复,the other有一个解决方案对提问者没有用,而我无法复制。