我已经可以获得操作系统标准输入设备的字节流。我现在想在程序运行时更改输入设备。
这是获取标准输入设备的 targetDataLine/输入流的代码(有效):
dataLineInfo = new DataLine.Info( TargetDataLine.class , getAudioFormat() ) ;
targetDataLine = (TargetDataLine)AudioSystem.getLine( dataLineInfo ) ;
targetDataLine.open( getAudioFormat() );
targetDataLine.start();
我还可以获取所有可用输入设备的列表,并将它们放在组合框中以选择另一个输入设备(它可以工作):
Mixer.Info[] mixerInfo;
mixerInfo = AudioSystem.getMixerInfo();
Line.Info targetDLInfo = new Line.Info(TargetDataLine.class);
for(int cnt = 0; cnt < mixerInfo.length; cnt++) {
Mixer currentMixer = AudioSystem.getMixer(mixerInfo[cnt]);
if( currentMixer.isLineSupported(targetDLInfo) ) {
combo1.addItem(mixerInfo[cnt].getName());
}
}
这是我如何更改输入设备的代码(它不起作用)
if(e.getSource() == combo1){
System.out.println("Gewählter Input: " + combo1.getSelectedItem());
Mixer.Info[] mixerInfo;
mixerInfo = AudioSystem.getMixerInfo();
Line.Info targetDLInfo = new Line.Info(TargetDataLine.class);
for(int cnt = 0; cnt < mixerInfo.length; cnt++) {
Mixer currentMixer = AudioSystem.getMixer(mixerInfo[cnt]);
if( mixerInfo[cnt].getName() == combo1.getSelectedItem().toString()) {
System.out.println("Gewählter Input gefunden");
targetDataLine.close();
dataLineInfo = new DataLine.Info( TargetDataLine.class , getAudioFormat() ) ;
try {
targetDataLine = (TargetDataLine) currentMixer.getLine(dataLineInfo) ;
targetDataLine.open( getAudioFormat() );
targetDataLine.start();
} catch (LineUnavailableException e1) {
e1.printStackTrace();
}
}}
}
事实上我认为我在最后一部分只犯了一个小错误,但我不知道是什么错误。如果我切换到另一个音频输入设备,我只会听到一声轻微的蜂鸣声,然后就什么也没有了。如果我切换回主音频设备,我可以再次听到输入。我没有收到任何错误。
我做错了什么?
最佳答案
用下面的代码就行了
if( mixerInfo[cnt].getName() == combo1.getSelectedItem().toString()) {
您没有正确比较字符串。比较字符串时使用 String.equals(String)
方法,如下所示:
if( mixerInfo[cnt].getName().equals(combo1.getSelectedItem().toString())) {
如果对任意两个非原始对象使用==
运算符,则只会比较这两个对象的指针。在绝大多数情况下,字符串对象将具有不同的指针值,就像任何其他动态分配的对象一样,无论它们指向的位置是否包含相同的字节排列。
关于java - java程序执行时如何更改音频输入设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26761770/