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

我的AudioInputStream audioInput该对象本身具有编码为ULAW为什么java AudioSystem.getTargetEncodings(AudioFormat)返回与我们提供的AudioFormat的编码不同的Encoding?

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说明(如果它可以帮助):

"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)返回与我们在参数中提供的AudioFormat的编码不同的结果?

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

  3. 我的解决方案是否合法?这真的窃听了我很多有,似乎没有一个很好的理由

回答:

据我到目前为止已经学会了工作的解决方案:

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

  2. 取决于“only”的含义。有可能有方法来改变你的系统的播放首选项,但我一直只使用默认或“支持”选项之一。

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

但对于我的音乐用途(SF游戏线索/ X - 我遇到不同类型的文件),我倾向于全部转换,外部,使用大胆,之前的游戏包装他们,以免在游戏过程中进行任何转换。

以上是 为什么java AudioSystem.getTargetEncodings(AudioFormat)返回与我们提供的AudioFormat的编码不同的Encoding? 的全部内容, 来源链接: utcz.com/qa/262259.html

回到顶部