Java Sound API是否可以访问其他(非Java)应用程序正在播放的声音?

时间:2014-08-12 06:07:55

标签: java audio audio-recording javasound

过去几周我一直在阅读Java Sound API,但我仍然无法弄清楚这是否可行。我问,因为我想编写一个程序,将声音数据传递到系统前往输出线,如我的计算机的扬声器或耳机插孔,并将该数据写入音频文件。

从我到目前为止所读到的关于javax.sound.sampled的内容来看,似乎我只能通过MixerTargetDataLine读取数据;但是,在编写测试程序(下面提供)后,查询我的系统中的可用混频器,然后查询这些混频器以获取可用的目标和源数据线;我实现了所有输出混音器,除了我的默认混音器只支持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有一个解决方案对提问者没有用,而我无法复制。

0 个答案:

没有答案