捕获内部音频java

时间:2014-12-14 20:08:48

标签: java audio capture

我将录制我的节目中的声音。我使用Ubuntu 14.04和PulseAudio。 现在我尝试从pulseaudio录制,但目前我只用麦克风录音。 如何从pulseaudio而不是麦克风录制声音?

public static void captureAudio() {
    try {
        final AudioFormat format = getFormat();
        DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
        final TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
        line.open(format);
        line.start();
        Runnable runnable = new Runnable() {
            int bufferSize = (int)format.getSampleRate() * format.getFrameSize();
            byte buffer[] = new byte[bufferSize];

            public void run() {
                out = new ByteArrayOutputStream();
                running = true;
                try {
                    while (running) {
                        int count = line.read(buffer, 0, buffer.length);
                        if (count > 0) {
                            out.write(buffer, 0, count);
                        }
                    }
                    out.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        };
        Thread captureThread = new Thread(runnable);
        captureThread.start();
    } catch (LineUnavailableException ex) {
        ex.printStackTrace();
    }
}

我在代码中尝试了一些改变这一点的事情:

Mixer mixer = AudioSystem.getMixer(null);

然后:

final TargetDataLine line = (TargetDataLine) mixer.getLine(info);

希望任何人都有解决方案。

问候 丹尼尔

1 个答案:

答案 0 :(得分:0)

仅从Java内部无法解决此问题。 Java只看到已经存在的设备,如下面的Java程序所示:

import javax.sound.sampled.*;

public class ListDevices {
    public static void main(final String... args) throws Exception {
        for (final Mixer.Info info : AudioSystem.getMixerInfo())
            System.out.format("%s: %s %s %s %s%n", info, info.getName(), info.getVendor(), info.getVersion(), info.getDescription());
    }
}

您需要做的是为音频系统创建一个环回设备。以下文章说明了如何做到这一点:https://askubuntu.com/questions/257992/how-can-i-use-pulseaudio-virtual-audio-streams-to-play-music-over-skype目的不同,但它应该适合您的情况,因为您的情况对我来说比该帖子中描述的情况更简单。

应该可以使用pactl从Java运行那些Process命令。