Java 的声音 API 不适用于所有 .WAV 文件?
Java's sound API doesn't work with all .WAV files?
我目前在使用 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 文件由于某种原因没有适当的编码,是否有一种万无一失的播放方式?
您可以使用以下代码获取支持的播放格式列表:
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 音频格式是 44100Hz 的 16 位 PCM。
您可以通过以下方式发现特定文件的格式:
File file = new File("path_to_file.wav");
AudioFormat fmt = AudioSystem.getAudioFileFormat(file).getFormat();
例如,这比尝试获取一行要宽松一些,但如果 WAV 文件具有例如mp3数据。 WAV 文件是一个容器,可以存储 PCM 以外的编码,其中一些 javax.sound.sampled
通常不支持。
如果您查找 UnsupportedAudioFileException,您会注意到当文件属于不受支持的类型或 格式 时会抛出该异常。格式决定了你。
Java 声音可以有多种不同的格式,但具体是哪种格式通常取决于系统。您可以找出支持哪些格式:
DataLine.Info.getFormats();
此方法 returns 一组 AudioFormat 对象,每个对象都描述了您的 Java 实现可以使用的一种音频语言。
鉴于您可以在其他播放器上播放这些文件,您系统的某些部分可能完全能够理解每种 wav 格式;但您可能会考虑检查它正在通过哪条数据线馈送,因为这并不意味着它们得到普遍支持。
我目前在使用 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 文件由于某种原因没有适当的编码,是否有一种万无一失的播放方式?
您可以使用以下代码获取支持的播放格式列表:
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 音频格式是 44100Hz 的 16 位 PCM。
您可以通过以下方式发现特定文件的格式:
File file = new File("path_to_file.wav");
AudioFormat fmt = AudioSystem.getAudioFileFormat(file).getFormat();
例如,这比尝试获取一行要宽松一些,但如果 WAV 文件具有例如mp3数据。 WAV 文件是一个容器,可以存储 PCM 以外的编码,其中一些 javax.sound.sampled
通常不支持。
如果您查找 UnsupportedAudioFileException,您会注意到当文件属于不受支持的类型或 格式 时会抛出该异常。格式决定了你。
Java 声音可以有多种不同的格式,但具体是哪种格式通常取决于系统。您可以找出支持哪些格式:
DataLine.Info.getFormats();
此方法 returns 一组 AudioFormat 对象,每个对象都描述了您的 Java 实现可以使用的一种音频语言。
鉴于您可以在其他播放器上播放这些文件,您系统的某些部分可能完全能够理解每种 wav 格式;但您可能会考虑检查它正在通过哪条数据线馈送,因为这并不意味着它们得到普遍支持。