相同Java代码Win10可播放AU文件,Win11抛异常求助
问题场景
使用Java 17.0.7编译执行以下代码播放.au音频文件:
import java.io.File; import java.io.IOException; import java.util.Scanner; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; public class SimpleAudioTest { Long currentFrame; static Clip clip; String status; AudioInputStream audioInputStream; static String filePath; public SimpleAudioTest() throws UnsupportedAudioFileException, IOException, LineUnavailableException { audioInputStream = AudioSystem.getAudioInputStream(new File("C:\\Temp\\mySound.au").getAbsoluteFile()); AudioFormat format = audioInputStream.getFormat(); if ((format.getEncoding() == AudioFormat.Encoding.ULAW) || (format.getEncoding() == AudioFormat.Encoding.ALAW)) { AudioFormat tmp = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), format.getSampleSizeInBits() * 2, format.getChannels(), format.getFrameSize() * 2, format.getFrameRate(), true); audioInputStream = AudioSystem.getAudioInputStream(tmp, audioInputStream); format = tmp; } clip = AudioSystem.getClip(); clip.open(audioInputStream); clip.loop(Clip.LOOP_CONTINUOUSLY); } public static void main(String[] args) { System.out.println("Running the test"); try { filePath = "Your path for the file"; SimpleAudioTest audioPlayer = new SimpleAudioTest(); clip.start(); Scanner sc = new Scanner(System.in); sc.close(); } catch (Exception ex) { System.out.println("Error with playing sound."); ex.printStackTrace(); } } }
程序在Windows 10下可正常播放,但在Windows 11下抛出异常:
java.lang.IllegalArgumentException: No line matching interface Clip supporting format PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian is supported。
差异原因分析
音频底层栈变更:Windows 11默认采用WASAPI(Windows Audio Session API)作为核心音频栈,而Windows 10对旧版MME(多媒体扩展)兼容更完善。Java的
javax.sound.sampled在Windows平台默认依赖MME,WASAPI对音频格式的校验更严格,不支持MME自动处理的非标准格式兼容逻辑。采样率兼容性限制:Windows 11的WASAPI不允许创建不匹配设备支持采样率的音频线路。异常中的“unknown sample rate”说明要么音频文件的采样率无法被正确解析,要么该采样率是当前音频设备不支持的非标准值。Windows 10的MME会自动进行采样率转换,隐式兼容这类非标准情况,而Windows 11的WASAPI直接拒绝创建Clip。
Java Sound API适配不足:Java 17的
javax.sound.sampled模块对Windows 11的WASAPI适配不完善,未实现自动采样率转换的兼容逻辑,导致原本在Windows 10下能正常处理的音频格式,在Windows 11下触发格式不支持的异常。
解决建议
- 显式转换音频采样率为系统设备支持的标准值(如44100Hz、48000Hz),避免依赖系统自动转换
- 改用对Windows 11音频栈兼容性更好的第三方音频库(如JavaFX MediaPlayer)
- 检查目标.au文件的实际采样率,确认其属于常见标准采样率范围
内容的提问来源于stack exchange,提问作者Unhandled Exception

