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

标签 java javasound

我有一个 AudioInputStream 音频输入,对象本身的编码为 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打开并抛出异常

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. 取决于你所说的“仅”是什么意思。可能有多种方法可以更改系统的播放首选项,但我总是使用默认选项或“支持”的选项之一。

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

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

关于java - 为什么 java AudioSystem.getTargetEncodings( AudioFormat ) 返回的 Encoding 与我们提供的 AudioFormat 的编码不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41866599/

相关文章:

java - 像GrepCode一样在Eclipse中浏览JDK源代码

java - 使用 Java 从 URL 获取声音

java - 无法在 jarfile 内播放声音

java - 在Java中读取MIDI消息: missing note-off event?

java - 声音将无法在Java中播放。.JFrame和Canvas不是Applet

java - 录音时检测静音

java midi 延迟

java - 如何创建引用特定 Java 方法的 Camel 路线?

java - 当只有类型很重要时,在 JPA 中保留成员变量

在流式传输 map 的列表内编辑值时出现 Java ConcurrentModificationException