java - java程序执行时如何更改音频输入设备?

标签 java audio input microphone

我已经可以获得操作系统标准输入设备的字节流。我现在想在程序运行时更改输入设备。

这是获取标准输入设备的 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/

相关文章:

java - 日历。反复发生的事件。如何检查开始日期是否与模式匹配?

java - Spring boot JPA从crudRepository查询中获取特定列

react-native - react native 切换样式

powershell - 是否可以在Powershell中从读取主机隐藏用户输入?

java - 限制用户扫描仪在Java中输入字符串的字符数

html - 是否可以防止文件对话框出现?为什么?

java - eclipse是否必须依赖于ANT等构建工具之一

java - 在java代码中嵌入数据文件

javascript - WebRTC:获取 mediaStream 的音频级别*无需*播放音频

android - 如何使用MediaPlayer再次播放/停止/播放