Java音频不会以正确的参数启动TargetDataLine

我有一个正确使用48000采样率,24位和1个通道的麦克风。 所以我将这些数据提供给AudioSystem.isLineSupported()并得到一个false

我试着喂8位而不是24位,它的工作原理。 但音频中有一个奇怪的背景嘶嘶声,所以我猜这不是我的事情。

问题:如何调试发生了什么? 我知道一个事实,即我所喂的设置是正确的,那么它会是什么呢?

我正在使用的代码(是的,它是Kotlin):

 fun main(args : Array) { var line: TargetDataLine? = null val thread = Thread(Runnable { val format = AudioFormat(48000f, 24, 1, false, false) val info = DataLine.Info(TargetDataLine::class.java, format) if (!AudioSystem.isLineSupported(info)) { System.out.println("Failed") } else { line = AudioSystem.getLine(info) as TargetDataLine line?.open(format) line?.start() val ais = AudioInputStream(line) AudioSystem.write(ais, AudioFileFormat.Type.WAVE, File("c:/temp/temp.wav")) } }) if (line != null) { thread.start() readLine() line?.stop() line?.close() } } 

我不完全相信你的代码底下究竟发生了什么。 但是,由于你喂8位,它可能只是一个音频混叠。 所以这个嘘声是预料之中的。

8位深度是一个非常差的音频分辨率。 它给你每个样本只有256个可能的值。 事实上,比特深度对信噪比有影响。 而这个比特的8比特深度等于48.16分贝,这是相当明显的嘶嘶声。

使用24位的结果格式不会自动改善您的8位数据源。 试着喂至少16位,嘶嘶声应该消失。