首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中获得所有有效系统AudioFormat对象的数组?

如何在Java中获得所有有效系统AudioFormat对象的数组?
EN

Stack Overflow用户
提问于 2022-04-22 02:52:28
回答 2查看 47关注 0票数 0

我正在创建一个可以在Java中播放合成音频的对象,但我需要能够使用操作系统可以播放的最高音频比特率将其设置为AudioFormat。

(Synth生成64位浮点音频,并可以将其压缩为32位浮点或PCM、24位、16位和8位PCM音频。)

我需要过滤所有操作系统的有效AudioFormats,并选择系统可以使用的最高比特率的格式。

如何才能获得系统可以在没有错误的情况下播放的所有AudioFormats的批准数组?

代码语言:javascript
复制
public class AudioSettings {
    
    // instance variables
    private int sampleRate;
    private AudioFormat audioFormat;
    private SourceDataLine sourceDataLine;
    
    public AudioSettings(int sampleRate) {
        
        this.sampleRate = sampleRate;
        
        // get highest possible quality bitrate for system
        int highestBitRate = 16;
        
        AudioFormat currentFormat = new AudioFormat(new Encoding("PCM_SIGNED"), (float) sampleRate, highestBitRate,
                2, highestBitRate / 8 * 2, sampleRate, true);
        
        for (AudioFormat format : /* What goes here? */) {

            if (format.getSampleSizeInBits() > highestBitRate 
                    && format.isBigEndian()
                    && format.getChannels() == 2) {
                currentFormat = format;
                highestBitRate = format.getSampleSizeInBits();
            }
        }
        
        audioFormat = currentFormat;
    }
    
}
EN

回答 2

Stack Overflow用户

发布于 2022-04-22 09:27:48

根据本文档frpm的Java 8天,Java语音技术,Java支持最大16位编码,最高采样率为48 kHz。

如果从那以后有任何进展的话。例如,必须有Java 17的规范,其中列出了规范。

至于在系统中查询受支持的文件类型,教程使用文件和格式转换器最后一节提到了:学习什么是可用的。

相关的AudioSystem方法getAudioFileTypes(AudioInputStream)作为AudioFileFormat.Type实例数组返回给定流的支持文件类型的完整列表。

票数 0
EN

Stack Overflow用户

发布于 2022-04-22 11:20:44

多亏了@gpasch,我从他的链接中找到了答案。虽然我认为您只需要读取Line.Info[]数组的一个实例,因为它似乎打印出了三个完全相同的组。

代码语言:javascript
复制
public static void main(String[] args) {
        
        Line.Info desired = new Line.Info(SourceDataLine.class);
        Line.Info[] infos = AudioSystem.getSourceLineInfo(desired);

        for (Line.Info info : infos) {
            if (info instanceof DataLine.Info) {
                AudioFormat[] forms = ((DataLine.Info) info).getFormats();

                for (AudioFormat format : forms) {
                    System.out.println(format);
                }
            }
        }

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71962955

复制
相关文章

相似问题

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