当前位置: 首页 > 知识库问答 >
问题:

Java的声音API不适用于所有.WAV文件?

家经纶
2023-03-14

我目前在使用< code>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();
        }
    }
}

此代码有时会抛出不支持的DaudioFileException

基本上,我有5个。我知道WAV文件没有被破坏,因为当我在音乐播放软件中打开它们时,它们播放得非常好。然而,Java程序只能处理其中的3种。

Oracle在这里提到了对这种文件格式的支持。我怎么能保证我所有的?WAV文件兼容Java的音频API?有没有万无一失的玩法。WAV文件,如果由于某种原因,他们没有适当的编码?

共有2个答案

韦棋
2023-03-14

如果查找UnsupportDaudioFileException,您会注意到,当文件类型不受支持或格式不受支持时,会抛出该异常。格式正是你想要的。

Java声音能够支持多种不同的格式,但哪些格式通常依赖于系统。您可以找到支持的格式:

DataLine.Info.getFormats();

该方法返回一个AudioFormat对象数组,每个对象描述一种Java实现可以使用的音频语言。

鉴于您可以在其他播放器上播放文件,系统的某些部分可能完全能够理解每种wav格式;但是您可以考虑检查它是通过哪条数据线传输的,因为这并不意味着它们得到普遍支持。

戎劲
2023-03-14

您可以使用以下代码获取播放支持的格式列表:

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;
}

音频格式.编码列出了 javax.声音.采样支持的编码。

一种安全的WAV音频格式是44100Hz的16位PCM。

您可以通过以下方式发现特定文件的格式:

File file = new File("path_to_file.wav");
AudioFormat fmt = AudioSystem.getAudioFileFormat(file).getFormat();

例如,这将比尝试获取一行稍微宽松一些,但如果WAV文件包含mp3数据,它仍然会抛出。WAV文件是一个容器,它可以存储PCM以外的编码,其中一些<code>javax.sound。采样通常不支持。

 类似资料:
  • 问题内容: 我想在演讲结束后通知a 。似乎没有用。我已经使用过,在语音功能中,我提到了以下内容。 我在调用语音功能时给出了“ UniqueId”,如下所示。 在“文字转语音”引擎结束说话后的“ 我的”中,应该运行Toast通知其已经结束说话。但是似乎不起作用。 所有代码如下。 请为此提供解决方案。 问题答案: 主要问题是: 1)在初始化tts之前设置进度监听器。 2)尝试用后台线程制作Toast。

  • 问题内容: 嗨,我需要将wav音频文件的采样率从44.1kHz下采样到8kHz。我必须使用字节数组手动完成所有工作…这是出于学术目的。 我目前正在使用2个类(接收器和源)来弹出和推送字节数组。一切顺利,直到到达需要使用线性插值对数据块进行下采样的部分为止。 由于我是从44100降采样到8000 Hz,因此我该如何插入一个包含约128000000字节的字节数组?现在,我弹出5、6或7个字节,具体取决

  • 这是我的问题,有人给了我一个函数,如果我理解得很好,它会把一些声音样本放入数组列表中。 我想创建一个。wav文件的音频曲目,我真的不知道如何做到这一点。 这是代码,因为也许我根本不懂。。。 下面是示例,在上面的代码中导入。

  • 问题内容: 首先,这是用于家庭作业或…项目。 我很难理解如何在Java项目中将声音数据波绘制到图形上的想法。我必须使用UI完全从头开始进行此分配,因此基本上要制作.wav文件编辑器。 我遇到的主要问题是将声音数据放入要绘制的图形中。 目前,我正在随机绘制一组值。 到目前为止,我有一个微型程序正在运行并验证wav文件,使其实际上是wav文件。 我正在使用FileInputStream读取它并进行验证

  • 我需要对表的总数进行断言,当我在映像表中为总数编写XPath时,这样做对所有场景都不起作用。我知道原因,因为表是动态的,所以有时它只有1个图像,有时它有5个图像,所以我很难编写适用于所有场景的x路径。 对于我所写的附加图像:在这里输入图像描述WebElement totalElement=driver。findElement(By.xpath(“/*[@id=“image_table”]/tbod

  • 我的目标是同时播放多个mp3、ogg或wav音乐文件,以便在视频游戏中创建适应性强的音乐。 我没有使用java sound API中的Clip类,而是创建了一个名为Track的类,多亏了mp3spi和vorbisspi,它可以通过在SourceDataLine中写入音频数据来读取mp3、ogg和wav文件。多亏了这篇帖子,我找到了这个解决方案: https://stackoverflow.com/