为什么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."
对不起,长细节,但这里是我的问题:
为什么java的AudioSystem。 getTargetEncodings(AudioFormat)返回与我们在参数中提供的AudioFormat的编码不同的结果?
因此,在我的情况下,这是否意味着即使文件本身的编码是ULAW,系统也只能用PCM_SIGNED编码来感知和处理文件?
我的解决方案是否合法?这真的窃听了我很多有,似乎没有一个很好的理由
回答:
据我到目前为止已经学会了工作的解决方案:
Java正在寻找在默认设置为播放系统的配置,而不是音频文件的格式。许多(大多数?)计算机系统设置为播放PCM_SIGNED。
取决于“only”的含义。有可能有方法来改变你的系统的播放首选项,但我一直只使用默认或“支持”选项之一。
该解决方案完全合法!流式转换是为这种情况编写的:许多音频文件类型,即设置为播放有限子集的系统。如果您希望以新格式编程转换和保存文件,它们也会有所帮助。
但对于我的音乐用途(SF游戏线索/ X - 我遇到不同类型的文件),我倾向于全部转换,外部,使用大胆,之前的游戏包装他们,以免在游戏过程中进行任何转换。
以上是 为什么java AudioSystem.getTargetEncodings(AudioFormat)返回与我们提供的AudioFormat的编码不同的Encoding? 的全部内容, 来源链接: utcz.com/qa/262259.html