Java声音API是否可以访问其他(非Java)应用程序播放的声音?
在过去的几周里,我一直在阅读Java声音API,但我仍然不知道这是否可行。我问这个问题是因为我想写一个程序,把通过系统的声音数据传输到输出线上,比如我电脑的扬声器或耳机插孔,然后把数据写入音频文件 从我到目前为止读到的关于Java声音API是否可以访问其他(非Java)应用程序播放的声音?,java,audio,audio-recording,javasound,Java,Audio,Audio Recording,Javasound,在过去的几周里,我一直在阅读Java声音API,但我仍然不知道这是否可行。我问这个问题是因为我想写一个程序,把通过系统的声音数据传输到输出线上,比如我电脑的扬声器或耳机插孔,然后把数据写入音频文件 从我到目前为止读到的关于javax.sound.sampled,我似乎只能通过TargetDataLine从Mixer读取数据;但是,在编写了一个测试程序(提供如下)来查询我的系统中是否有可用的混频器,然后查询这些混频器中是否有可用的目标和源数据线;我实现了所有的输出混频器,除了默认的混频器,它只支持
javax.sound.sampled
,我似乎只能通过TargetDataLine
从Mixer
读取数据;但是,在编写了一个测试程序(提供如下)来查询我的系统中是否有可用的混频器,然后查询这些混频器中是否有可用的目标和源数据线;我实现了所有的输出混频器,除了默认的混频器,它只支持SourceDataLine
s。此外,我无法判断计算机默认混音器(我有Macbook pro)中的TargetDataLine
是否可以读取从其他应用程序发送到混音器的音频数据。所以在我深入研究这个项目之前,我想知道是否有可能访问其他应用程序通过混音器发送的声音
测试程序
import javax.sound.sampled.*;
导入java.util.Scanner;
公共类捕获{
公共静态最终字符串ANSI_RED=“\u001B[31m”;
公共静态最终字符串ANSI_GREEN=“\u001B[32m”;
公共静态最终字符串ANSI_RESET=“\u001B[m”;
专用混音器;
公共捕获(){
Mixer.Info[]installedMixers=AudioSystem.getMixerInfo();
对于(int n=0;n=0&&choice
另外,我发现了另外两个与这个主题相关的问题,似乎根本没有提供解决方案。从未得到回答,有一个解决方案对询问者不起作用,我无法重现。要查看PC的
数据线
对象,另请参见中的媒体类型
。我编写了一个应用程序。该应用程序如此深入系统und行在屏幕上显示信号的轨迹。它在一些基于Windows的机器上工作正常,完全失败(没有合适的行)在其他方面。我被引导了解到,苹果在OS X上的Java Sound API支持甚至更不稳定,尽管那是在Mac上的Oracle JRE之前。@AndrewThompson感谢您的响应!您的MediaTypes
应用程序比我编写的应用程序表现得更好。您愿意分享您编写的应用程序的源代码吗要点击系统声音线并显示信号的轨迹?如果您只是分享您点击声音线的方法,这对我来说甚至会很有帮助。此外,如果仅使用Java声音API无法实现这一点,是否有某种方法可以使用本机
方法在另一种语言中实现解决方案再次感谢你抽出时间来帮忙。
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();
}
}