首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从AudioFormat获得支持的AudioSystem列表

从AudioFormat获得支持的AudioSystem列表
EN

Stack Overflow用户
提问于 2021-08-15 09:01:26
回答 1查看 77关注 0票数 0

我希望能够研究系统中支持的可用AudioFormat类型,以便从一系列选项中选择一个适当的类型,使用帧速率和信道的首选值和回退值。

AudioSystem不支持直接查询支持的音频格式,但我可以从Mixer获得可用的SourceDataLine列表。SourceDataLine继承了一个DataLine.Info内部调用,其中有一个返回可用格式的方法:getFormats ()

因此,我的主要问题是:是否有一种方法可以从Java音频系统中获取受支持的AudioFormat 对象数组?

失败:有一种方法可以从AudioFormat Mixer**?**中获取受支持的对象数组

失败的原因是:DataLine.Info 是否有可能从 SourceDataLine 中获取对象?

理想情况下,我想做如下事情:

代码语言:javascript
复制
    public void exec () {
        Mixer.Info [] mixerInfoList = AudioSystem.getMixerInfo ();
        for (Mixer.Info mixerInfo : mixerInfoList) {
            System.out.println (mixerInfo.getDescription ());
            Mixer mixer = AudioSystem.getMixer (mixerInfo);
            Line.Info [] lineInfoList = mixer.getSourceLineInfo ();
            for (Line.Info rawLineInfo : lineInfoList) {
                System.out.println ("  " + rawLineInfo.toString ());
                DataLine.Info lineInfo = (DataLine.Info) rawLineInfo;
                AudioFormat [] formats = lineInfo.getFormats ();
                for (AudioFormat fmt : formats) {
                    System.out.println ("    " + fmt.toString ());
                }
            }
        }
    }

但是这在行DataLine.Info lineInfo = (DataLine.Info) rawLineInfo;上失败了,因为rawLineInfo显然是一个依赖于实现的对象,而不是DataLineInfo的一个实例。

非常令人失望的是,mixer.getSourceLineInfo ()没有返回一个DataLine.Info数组。它没有理由不能这样做,因为相关的行确实是SourceDataLine的实现,因此必须支持AudioFormat

在接受的答案中使用@gpasch (谢堆伙伴)提供的信息,这是我的最后解决方案。函数isDesirable只识别我感兴趣的音频格式。类AudioFormatKey是一个包装器,它为distinct()转换提供equals()的实现,为sorted()转换提供compareTo()的实现。

代码语言:javascript
复制
    public void exec () {
        System.out.println ("Available formats (stream):");
        Arrays.stream (AudioSystem.getSourceLineInfo (new Line.Info (SourceDataLine.class)))
                .filter (info -> info instanceof DataLine.Info)
                .map (info -> (DataLine.Info) info)
                .flatMap (dlinfo -> Arrays.stream (dlinfo.getFormats ()))
                .filter (this::isDesirable)
                .map (AudioFormatKey::new)
                .distinct ()
                .sorted ()
                .map (AudioFormatKey::getFormat)
                .forEach (format -> System.out.println ("  " + format));
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-16 00:23:50

我有一个东西-它得到了Windows格式的列表。我不知道它们是否都得到了支持,或者它们是否有效,但它给出了一个列表。

代码语言:javascript
复制
  public void getFormats() {
    Line.Info desired = new Line.Info( SourceDataLine.class );
    Line.Info[] info = AudioSystem.getSourceLineInfo( desired );
    for ( int i = 0;  i < info.length; ++i ) {
      System.out.println(i+" "+info[i].toString());
      if ( info[ i ] instanceof DataLine.Info ) {
        AudioFormat[] forms = ((DataLine.Info) info[i]).getFormats();
        for ( int n = 0;  n < forms.length;  ++n ) System.out.println( forms[ n ].toString() );
      }
    }
    desired = new Line.Info( TargetDataLine.class );
    info = AudioSystem.getTargetLineInfo( desired );
    for ( int i = 0;  i < info.length; ++i ) {
      System.out.println(i+" "+info[i].toString());
      if ( info[ i ] instanceof DataLine.Info ) {
        AudioFormat[] forms = ((DataLine.Info) info[i]).getFormats();
        for ( int n = 0;  n < forms.length;  ++n ) System.out.println( forms[ n ].toString() );
      }
    }
  }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68790117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档