为什么 java AudioSystem.getTargetEncodings( AudioFormat ) return 与我们提供的 AudioFormat 的编码不同?

Why does java AudioSystem.getTargetEncodings( AudioFormat ) return different Encoding than the encoding of the AudioFormat we provide?

我有一个 AudioInputStream audioInput,对象本身的编码为 ULAW

System.out.println( audioInput.getFormat().getEncoding() ); 

控制台中的returnULAW编码。

ULAW

但是,当我使用 AudioSystem.getTargetEncodings( audioInput ) 时,它 return 一组不同的编码

    Encoding availableEncoding[] =  AudioSystem.getTargetEncodings( audioIn.getFormat() );
    for ( Encoding encode : availableEncoding ) 
    {
        System.out.println( encode );
    }

其中 return :

PCM_SIGNED

问题是,我必须处理很多这样的文件,其中对象的编码和目标编码不匹配。 AudioSystem clip 无法打开这些音频文件并抛出异常

Clip audioClip = AudioSystem.getClip();
audioClip.open( audioInput ); 
// this throws error javax.sound.sampled.LineUnavailableException: line with format ULAW 8000.0 Hz, 8 bit, mono, 1 bytes/frame,  not supported.

但是,如果我将音频转换为目标编码之一

audioInput = AudioSystem.getAudioInputStream( Encoding.PCM_SIGNED , audioInput);
audioClip.open( audioInput );  //it works !!

虽然这种方法似乎适用于所有要处理的声音文件,但我对我在做什么几乎没有足够的了解。根据 java 文档,AudioSystem.getTargetEncodings 描述是(以防万一):

"Obtains the encodings that the system can obtain from an audio input stream with the specified format using the set of installed format converters."

抱歉说得太详细了,但这是我的问题:

  1. 为什么 java AudioSystem.getTargetEncodings( AudioFormat ) return 与我们在参数中提供的 AudioFormat 的编码结果不同?

  2. 这是否意味着,在我的例子中,即使文件本身的编码是 ULAW,系统也只能使用 PCM_SIGNED 编码来感知和处理文件?

  3. 我的解决方案合法吗?有一个没有充分理由似乎有效的解决方案真的让我很烦恼

据我目前所了解的:

  1. Java 正在查看系统配置的默认播放设置,而不是音频文件的格式。许多(大多数?)计算机系统都设置为播放 PCM_SIGNED。

  2. 取决于您所说的 "only." 可能有多种方法可以更改系统的播放首选项,但我一直使用默认设置,或者 "supported"选项。

  3. 解决方案完全合法!流式转换正是针对这种情况编写的:许多音频文件类型,设置为播放有限子集的系统。如果您希望以新格式以编程方式转换和保存文件,它们也会提供帮助。

但对于我的音频用途(SF/X 用于游戏提示——我遇到过不同类型的文件),我倾向于使用 Audacity 在外部将它们全部转换,然后再将它们与游戏打包,以免在游戏过程中进行任何转换。