- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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."
抱歉,细节太长,但这是我的问题:
为什么 java AudioSystem.getTargetEncodings( AudioFormat ) 返回的结果与我们在参数中提供的 AudioFormat 的编码不同?
那么,就我而言,这是否意味着即使文件本身的编码是 ULAW ,系统也只能使用 PCM_SIGNED 编码来感知和处理文件?
我的解决方案合法吗?有一个似乎没有充分理由就有效的解决方案确实让我很烦恼
最佳答案
根据我迄今为止所学到的:
Java 正在查看系统配置的默认播放设置,而不是音频文件的格式。许多(大多数?)计算机系统都设置为播放 PCM_SIGNED。
取决于你所说的“仅”是什么意思。可能有多种方法可以更改系统的播放首选项,但我总是使用默认选项或“支持”的选项之一。
解决方案完全合法!流式转换是针对这种情况编写的:许多音频文件类型,系统设置为播放有限的子集。如果您希望以编程方式转换文件并以新格式保存文件,它们也会有所帮助。
但是对于我的音频用途(用于游戏提示的 SF/X - 我遇到不同类型的文件),我倾向于在将它们打包到游戏中之前使用 Audacity 从外部将它们全部转换,以免必须在游戏过程中进行任何转换。
关于java - 为什么 java AudioSystem.getTargetEncodings( AudioFormat ) 返回的 Encoding 与我们提供的 AudioFormat 的编码不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41866599/
我正在尝试开发像 Shazam 这样的 Android 应用程序。我搜索了 Shazam 在 Google 上的工作方式,我找到了 this to read .如您所见,它首先录制歌曲。但是我在录制代
我有一个 AudioInputStream 音频输入,对象本身的编码为 ULAW System.out.println( audioInput.getFormat().getEncoding() );
手册does not answer this question :它说“新编码类型的名称”。 这只是一个像文件名一样的任意名称吗?或者这是一些预定义的名称,例如在 Charset.forName()
我这里有一个 WAV 文件:http://uppit.com/slpmuzpywxhs/202.wav 我需要构造一个Java AudioFormat使用以下参数基于该声音文件的属性的对象: floa
我正在尝试播放服务器通过 UDP 返回给我的音频流。服务器使用DPCM对音频进行编码,因此每个字节包含两个音频样本。当我使用 8 位/样本播放音频时,一切正常,但是当我尝试使用 16 位执行 Audi
这是我第一次尝试使用 Java Sound,我想要实现的是获取源行和目标行格式,以便我可以收听数据并通过创建包含详细信息的正确 AudioFormat 对象将其记录到文件中获得了,但是当尝试通过 Ja
我正在尝试连接我的调音台 -> remoteio -> 动态处理器 这是我的音频格式 //描述格式 memset( &audioFormat, 0, sizeof(AudioStreamBasicDe
根据 Android 开发者文档,AudioFormat 类将使用 AudioFormat.Builder 类实例化,但我无法这样做,因为 AudioFormat.Builder 无法解析为类型? A
我在 linux 操作系统上运行我的代码时出现以下异常。这段代码在 windows 操作系统上运行良好。下面是异常和使用的代码。 java.lang.IllegalArgumentException:
我曾尝试编写播放声音文件的程序,但到目前为止还没有成功。我无法理解代码的某些部分: InputStream is = new FileInputStream("sound file"); Aud
我是一名优秀的程序员,十分优秀!