首页 > 解决方案 > 无法选择麦克风 TargetDataLine。似乎,我只能使用我的操作系统系统默认的输入

问题描述

我正在尝试从不同的麦克风读取音频输入。我发现非常有线的行为。看来,无论我选择什么麦克风,我都只能为系统默认的麦克风抓取声音。我知道这一点,因为来自两个“麦克风”的信号总和相似,所以我点击了默认系统麦克风。我究竟做错了什么?


import java.util.LinkedList;
import java.util.List;

import javax.sound.sampled.*;

public class AudioTest {

    public static void main(String[] args) throws LineUnavailableException {

        AudioFormat format = new AudioFormat(8000.0f, 16, 1, true, true);

        // list all microphones
        List<Line.Info> micList = enumerateMicrophones();

        // assign microphone1
        TargetDataLine microphone1 = (TargetDataLine) AudioSystem.getLine(micList.get(1));
        
        // assign microphone2
        TargetDataLine microphone2 = (TargetDataLine) AudioSystem.getLine(micList.get(2));
        
        // read sound from microphone1
        byte[] data1 = new byte[1000];
        microphone1.open(format);
        microphone1.start();
        microphone1.read(data1, 0, 1000);

        // read sound from microphone2
        byte[] data2 = new byte[1000];
        microphone2.open(format);
        microphone2.start();
        microphone2.read(data2, 0, 1000);

        // Print sum (bigger for laud sounds). 
        // Similar values means - both microphones are in fact the same     
        System.out.println("Mic1: " + calcSum(data1));
        System.out.println("Mic2: " + calcSum(data2));
    }
    
    static long calcSum(byte[] data) {
        long sum = 0;
        for(byte bt: data) {
            sum += Math.abs(bt);
        }
        return sum;
    }

    public static List<Line.Info> enumerateMicrophones() {
        List<Line.Info> out = new LinkedList<Line.Info>();
        Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo();
        for (Mixer.Info info : mixerInfos) {
            Mixer m = AudioSystem.getMixer(info);
            Line.Info[] lineInfos = m.getTargetLineInfo();
            for (Info lineInfo : lineInfos) {
                if (lineInfo.getLineClass().equals(TargetDataLine.class)) {
                    out.add(lineInfo);
                    System.out.println("Mixer: " + info.toString() + "          Line: " + lineInfo.toString());
                }
            }
        }
        return out;
    }

}

打印的混合器/线是:

Mixer: PulseAudio Mixer, version 0.02 Line: interface TargetDataLine supporting 42 audio formats, and buffers of 0 to 1000000 bytes

Mixer: default [default], version 4.15.0-108-generic Line: interface TargetDataLine supporting 512 audio formats, and buffers of at least 32 bytes

Mixer: PCH [plughw:0,0], version 4.15.0-108-generic Line: interface TargetDataLine supporting 24 audio formats, and buffers of at least 32 bytes

有时我还有一台设备:

Mixer: Device [plughw:1,0], version 4.15.0-108-generic Line: interface TargetDataLine supporting 4 audio formats, and buffers of at least 32 bytes

有时不是。有线

我的操作系统 Ubuntu 看到的内容:

#arecord -l

**** List of CAPTURE Hardware Devices ****

card 0: PCH [HDA Intel PCH], device 0: ALC269VC Analog [ALC269VC Analog]

Subdevices: 1/1

Subdevice #0: subdevice #0

card 1: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]

Subdevices: 1/1

Subdevice #0: subdevice #0

我有一个通过 USB 连接的麦克风,一个内置在笔记本电脑中。

标签: javaaudioaudio-recording

解决方案


推荐阅读