以下是我用来确定声音文件的代码是否可以Clip
播放(用Kotlin编写)。
它在Windows上的24位文件上返回false
但在Mac上返回true
,结果不同。为什么它不会在每个系统上返回相同的结果?
fun isValidFile(file: File): Boolean{
try {
val format = AudioSystem.getAudioFileFormat(file).format
val info = DataLine.Info(Clip::class.java, format)
val audioSystem = AudioSystem.getLine(info)
return audioSystem is Clip
}
catch (e : Exception){
return false
}
}
24位文件可在Mac上播放,但如果我尝试按FloatControl
调整音量,则会出现Unsupported control type: Master Gain
错误,而16位文件工作正常。
clip.getControl(FloatControl.Type.MASTER_GAIN) as FloatControl
答案 0 :(得分:1)
“为什么不在每个系统上返回相同的结果?”
操作系统及其配置的各种计算机和卡都是Java外部的。它们使用的标准和它们提供的控制方式不同。缺少特定格式的音量控制很可能取决于特定操作系统的可用性。
出于我的目的,我发现音量控制和其他控制(平移,各种效果)是如此的昙花一现,对于我想要做的事情,我咬了一下子弹并在Java中编写了这些函数。这可以通过使用SourceDataLine而不是Clip来完成,因为SourceDataLine会在播放时将数据公开给编码器。
我也满足于标准的“CD质量”格式:16位,立体声,44100 fps,因为这是目前我遇到的所有Java系统上实现的最高标准。 (我对Raspberry PI没有任何经验 - 如果IDK在那里工作的话也是如此。)
图书馆可以提供帮助,并可以检查代码的示例。