我目前在使用javax.sound.sampled
库时遇到问题。这是我用来播放音频文件的MCV代码:
import javax.sound.sampled.*;
import java.io.File;
public class Foo
{
public static void main(String[] args)
{
try
{
File f = new File("alarm.wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(f);
Clip clip = AudioSystem.getClip();
clip.open(ais);
clip.start();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
此代码有时会抛出UnsupportedAudioFileException
。
基本上,我有5个.WAV文件,我知道这些文件没有损坏,因为当我在我的音乐播放软件中打开它们时,它们的播放效果非常好。但是,Java程序仅适用于其中的3个。
Oracle mentions support for this file format here.如何确保所有.WAV文件都与Java的音频API兼容?是否有一种万无一失的播放.WAV文件的方式,如果由于某种原因他们没有适当的编码?
答案 0 :(得分:5)
您可以使用以下代码获取支持的播放格式列表:
public static List<AudioFormat> getSupportedAudioFormats() {
List<AudioFormat> result = new ArrayList<>();
for (Line.Info info : AudioSystem.getSourceLineInfo(
new Line.Info(SourceDataLine.class))) {
if (info instanceof SourceDataLine.Info) {
Collections.addAll(result, ((SourceDataLine.Info) info).getFormats());
}
}
return result;
}
AudioFormat.Encoding
列出了javax.sound.sampled
支持的编码。
安全的WAV音频格式是44位的16位PCM。
您可以通过以下方式发现特定文件的格式:
File file = new File("path_to_file.wav");
AudioFormat fmt = AudioSystem.getAudioFileFormat(file).getFormat();
这比尝试获取一行更宽松,但如果WAV文件有例如,它仍会抛出。 mp3数据。 WAV文件是一个容器,可以存储PCM以外的编码,其中一些javax.sound.sampled
通常不支持。
答案 1 :(得分:1)
如果查找UnsupportedAudioFileException,当文件属于不受支持的类型或不受支持的格式时,您会注意到它被抛出。格式是给你的。
Java Sound能够使用各种不同的格式,但具体哪些格式通常取决于系统。您可以找到支持的格式:
DataLine.Info.getFormats();
此方法返回一个AudioFormat对象数组,每个对象描述一个Java实现可以说的音频语言。
鉴于您可以在其他播放器上播放文件,系统的某些部分很可能完全能够理解每种wav格式;但您可能会考虑检查它所通过的数据线,因为这几乎不意味着它们受到普遍支持。