java - 无法选择麦克风 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 连接的麦克风,一个内置在笔记本电脑中。
解决方案
推荐阅读
- visual-studio-2013 - 如何将自定义规则添加到“Resharper 的 StyleCop”?
- amazon-web-services - 自定义资源支持的 Lambda“CREATE_IN_PROGRESS”永远
- excel - 如何在每行使用单个数组公式时对当前列中的行求和()?
- python - 为什么 pd.MultiIndex.from_tuples 改变元组的顺序
- express - Angular: Proxy server truncates XHR response
- crystal-reports - 如何在英文水晶报告中显示单词中的数量
- c++ - arm aarch64 sizeof打包结构与32位不同
- r - 用 purrr 更改 r 中的许多列类型
- ruby-on-rails - Rails:使用远程渲染链接:true 不会触发 AJAX
- typo3 - Persisting value objects in Typo3