2017-03-01 51 views
-3

我需要在Java中创建一个函数,该函数为音频添加特定频率和长度的音符。我的频率为双倍,音符长度以毫秒为单位。如何从帧的长度(以毫秒为单位)查找音符的帧长,字节和整数

全功能描述:

This method takes one AudioInputStream and adds the sound of a certain pure frequency to the FRONT of it, lasting a certain length of time. So the method takes two additional parameters: frequency and noteLengthInMilliseconds. The amplitude of the additional sound should be 64*256.

不过,我需要找到音符在帧的长度,以及在字节数和整数。

此外,关于如何创建笔记作为样本数据数组(使用java.sound.sampled包)的任何建议将会有所帮助。

FRAME &采样率:44100.0hz
编码:PCM_SIGNED

+0

什么样的框架? PCM帧?采样率是多少?而且,“以及字节和Ints”是什么意思? – Brad

+0

PCM_SIGNED编码,44,100.0赫兹采样率 – Markeazy

回答

1

由于您的帧速率和采样率是相同的,我们假设你指的是PCM帧。 PCM帧是每个通道一个样本。如果你只有一个音频通道,每个采样16位,你会得到每两个字节一帧。如果您有每个采样16位的立体声音频,则每四个字节会获得一个帧。

要计算出长度,请取样速率并将其分开。如果我有44.1 kHz的采样率,我想记要持续1.5秒:

44,100 * 0.5 = 22,050 samples (22,050 frames) 

从那里,如果你知道音频是16位,而只有一个通道:

22,050 * 2 (bytes per channel) * 1 (channels) = 44,100 bytes 
+0

所以,如果我有毫秒的长度和44的采样率。1千赫,有两个通道,我只是简单地做: '(44,100 * noteLengthInSeconds)* 2(字节每通道)* 2(通道)'? – Markeazy

+0

是的。不要忘记将您的毫秒转换为秒。 – Brad

1

帧中的长度是一个简单的计算,它依赖于AudioFormat中的信息。具体来说,检查属性“frameRate”。每帧的字节数由frameSize属性覆盖。

使您的音频数据数组涉及几个步骤。纯音的值可以通过运行Math.sin函数来创建。 Math.PI * 2相当于一个完整周期(我希望你已经知道这一点 - 这是非常基本的),所以使用division来计算每个步骤的增量有多小。

Math.sin函数的结果是-1和1之间的双精度值。您必须将此数字转换为适合赋值的数据范围。这是通过将音频值乘以一个因子来完成的。例如,乘以32767将导致填充Short或16位的范围被签名。

从Short到Byte的转换部分取决于您是否是big-endian或little-endian。您还必须管理是否有多个曲目(例如,立体声是常见的)。所有这些步骤已被覆盖在其他Stackoverflow的帖子。

一旦你有了数据阵列,它如何与现有的音频相结合,部分取决于你是输出音频还是试图创建一个新的wav文件来导出。 Java教程的Audio Trail中有一些章节涵盖了回放,保存文件以及文件格式和格式转换的一个很好的部分(强烈建议您阅读本文)。

相关问题