我正在创建一个可以在Java中播放合成音频的对象,但我需要能够使用操作系统可以播放的最高音频比特率将其设置为AudioFormat。
(Synth生成64位浮点音频,并可以将其压缩为32位浮点或PCM、24位、16位和8位PCM音频。)
我需要过滤所有操作系统的有效AudioFormats,并选择系统可以使用的最高比特率的格式。
如何才能获得系统可以在没有错误的情况下播放的所有AudioFormats的批准数组?
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;
}
}发布于 2022-04-22 09:27:48
根据本文档frpm的Java 8天,Java语音技术,Java支持最大16位编码,最高采样率为48 kHz。
如果从那以后有任何进展的话。例如,必须有Java 17的规范,其中列出了规范。
至于在系统中查询受支持的文件类型,教程使用文件和格式转换器最后一节提到了:学习什么是可用的。
相关的
AudioSystem方法getAudioFileTypes(AudioInputStream)作为AudioFileFormat.Type实例数组返回给定流的支持文件类型的完整列表。
发布于 2022-04-22 11:20:44
多亏了@gpasch,我从他的链接中找到了答案。虽然我认为您只需要读取Line.Info[]数组的一个实例,因为它似乎打印出了三个完全相同的组。
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);
}
}
}
}https://stackoverflow.com/questions/71962955
复制相似问题