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

为什么java AudioSystem.getTargetEncodings(AudioFormat)返回的编码与我们提供的AudioFormat的编码不同?,java,javasound,Java,Javasound,我有一个AudioInputStream audioInput,对象本身编码为ULAW System.out.println( audioInput.getFormat().getEncoding() ); 返回控制台中的ULAW编码 ULAW 但是,当我使用AudioSystem.getTargetEncodings(audioInput)时,它会返回一组不同的编码 Encoding availableEncoding[] = AudioSystem.getTargetEnco

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

System.out.println( audioInput.getFormat().getEncoding() ); 
返回控制台中的ULAW编码

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

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

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

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描述为(如果可能有帮助):

很抱歉说了这么多细节,但以下是我的问题:

  • 为什么java AudioSystem.getTargetEncodings(AudioFormat)返回的结果与参数中提供的AudioFormat编码不同

  • 那么,在我的例子中,这是否意味着即使文件本身的编码是ULAW,系统也只能通过PCM_符号编码来感知和处理文件

  • 我的解决方案合法吗?如果没有一个好的理由,有一个似乎有效的解决方案,那真的让我很不舒服


  • 根据我目前所了解的情况:

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

  • 取决于“仅”的含义。可能有多种方法可以更改系统的播放首选项,但我总是选择默认选项或“支持”选项之一

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


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

    根据我到目前为止学到的知识:

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

  • 取决于“仅”的含义。可能有多种方法可以更改系统的播放首选项,但我总是选择默认选项或“支持”选项之一

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


  • 但对于我的音频用途(游戏提示的SF/X——我遇到了不同类型的文件),我倾向于在将它们打包到游戏之前,使用Audacity从外部转换它们,这样就不必在游戏过程中进行任何转换。

    我不知道这里讲的是什么,但如果它起作用,它就起作用了-AudioSystem.getTargetEncodings返回系统可以转换的内容-因此它可以转换为PCM-很好!我不知道完整的故事,所以我不能评论它是否在短期内是合法的,如果它起作用,你很好-如果你遇到问题,回来吧哈哈,很抱歉给你讲课。我真的想尽可能多地提供我所学到的信息。我有点觉得这会适得其反,因为我不知道这里讲的是什么,但如果它有效,它就有效了-AudioSystem.getTargetEncodings返回系统可以转换的内容-因此它可以转换为PCM-很好!我不知道完整的故事,所以我不能评论它是否在短期内是合法的,如果它起作用,你很好-如果你遇到问题,回来吧哈哈,很抱歉给你讲课。我真的想尽可能多地提供我所学到的信息。我觉得这也会适得其反
    "Obtains the encodings that the system can obtain from an audio input stream with the specified format using the set of installed format converters."