You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

相同Java代码Win10可播放AU文件,Win11抛异常求助

Windows 11与Windows 10下Java播放.au音频的差异问题

问题场景

使用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。

差异原因分析

  1. 音频底层栈变更:Windows 11默认采用WASAPI(Windows Audio Session API)作为核心音频栈,而Windows 10对旧版MME(多媒体扩展)兼容更完善。Java的javax.sound.sampled在Windows平台默认依赖MME,WASAPI对音频格式的校验更严格,不支持MME自动处理的非标准格式兼容逻辑。

  2. 采样率兼容性限制:Windows 11的WASAPI不允许创建不匹配设备支持采样率的音频线路。异常中的“unknown sample rate”说明要么音频文件的采样率无法被正确解析,要么该采样率是当前音频设备不支持的非标准值。Windows 10的MME会自动进行采样率转换,隐式兼容这类非标准情况,而Windows 11的WASAPI直接拒绝创建Clip。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 00:47:39