【问题标题】:Synthesizing sampled sound合成采样声音
【发布时间】:2011-02-10 00:56:49
【问题描述】:

我正在尝试将整数数组转换为声音表示。目前,我将每个值作为单独的短音播放,但我想从信息中创建一个采样波并播放它,如下所示:

image

每个红点代表一个数据点。理想情况下,我希望得到一个简单的方法,例如playSound(int[] array);。我查看了 javax.sound.sampled 包,但不知道从哪里开始。

【问题讨论】:

    标签: java arrays audio sampling trigonometry


    【解决方案1】:

    首先,样本数组不足以播放声音。

    • 您还需要指定采样率。 (例如,如果以 25 个样本/秒的速度记录,50 个重复 -1、+1 等的样本可能是 50 赫兹的正弦波,如果以 50 个样本/秒的速度记录,则可能是 12.5 赫兹的波(我的数学可能是关闭的))。

    • 需要的另一件事是如何存储声音。 MAX_INT 是您的最高声音还是 255 是您的最高音量?

    • 您还需要指定编码。您可能需要 PCM_SIGNED 或 PCM_UNSIGNED(取决于您是否有负样本),或者甚至可能需要使用其他编码。

    javax.sound.sampled 包在AudioFormat 类中表示此信息。

    您需要构建一种音频格式,以反映您的音频作为样本的方法。例如,如果您的样本占据了整个整数范围,并且您用整数表示每个样本,并且您以每秒 22,000 个样本的速度进行采样,并且它是单声道声音,您将构建以下 AudioFormat...

    AudioFormat desiredFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,22000,32,1,32,22000,true);
    

    拥有 AudioFormat 后,您可以打开一行并将音频转储到其中。 This page 演示了如何做到这一点(他们作弊并正在播放音频文件,以便从文件中获取 AudioFormat)。

    当然,您可能无法为所有格式打开一行,因此您可能需要进行一些转换。综上所述,可能有 Java 声音库可以使这变得更容易。

    【讨论】:

    • 感谢您的信息!要回答一些问题,值只有 0-99,数组的长度在 5-500 之间。采样率对我来说并不重要,尽管我希望样本的总长度在 100-300 毫秒左右。
    • 请记住,值 0-99 将为您提供相当于
    猜你喜欢
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多