【问题标题】:Java Sound API. Getting supported audio formats from mixerJava 声音 API。从混音器获取支持的音频格式
【发布时间】:2019-05-17 03:13:13
【问题描述】:

我正在尝试从通过 USB 连接到我的电脑的外部混音器获取线路。 所以我写了一个简单的程序来列出所有的混音器以及它们各自的源行(输出)和目标行(输入),并且它工作正常:

import javax.sound.sampled.*;

public class TestResources {
    public static void main(String args[]) {
        try {
            Mixer.Info [] mixers = AudioSystem.getMixerInfo();
            for(int i = 0 ; i< mixers.length; i ++) {
                System.out.println((i+1)+". " + mixers[i].getName() + " --> " + mixers[i].getDescription() );

                Line.Info [] sourceLines = AudioSystem.getMixer(mixers[i]).getSourceLineInfo();
                System.out.println("\tSource Lines:" );
                for(int j = 0; j< sourceLines.length; j++) {
                    System.out.println("\t" + (j+1) + ". " + sourceLines[j].toString() );
                }
                System.out.println();

                Line.Info [] targetLines = AudioSystem.getMixer(mixers[i]).getTargetLineInfo();                 
                System.out.println("\tTarget Lines:" );
                for(int j = 0; j< targetLines.length; j++) {
                    System.out.println("\t" + (j+1) + ". " + targetLines[j].toString() );

                }       
                System.out.println("\n" );
            }           
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

但是,当我真正尝试获得我需要的线路时:

    AudioFormat format = new AudioFormat(44100, 16, 2, true, true);
    Mixer.Info [] mixers = AudioSystem.getMixerInfo();
    final TargetDataLine microphone = AudioSystem.getTargetDataLine(format, mixers[2]);

我收到一条错误消息,指出以下行不支持该格式:

java.lang.IllegalArgumentException: Line unsupported: interface TargetDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 8 bytes/frame, big-endian

如何扩展初始程序以打印每行支持的格式? 提前致谢。

【问题讨论】:

标签: java audio javasound mixer audioformat


【解决方案1】:

此方法打印Line.Info 对象支持的格式:

static void showLineInfoFormats(final Line.Info lineInfo)
{
  if (lineInfo instanceof DataLine.Info)
   {
     final DataLine.Info dataLineInfo = (DataLine.Info)lineInfo;

     Arrays.stream(dataLineInfo.getFormats())
           .forEach(format -> System.out.println("    " + format.toString()));
   }
}

【讨论】:

    猜你喜欢
    • 2012-08-08
    • 1970-01-01
    • 2023-04-06
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多