有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从以毫秒为单位的长度中查找以帧、字节和整数为单位的注释长度

我需要用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.

但是,我需要以帧、字节和整数为单位查找注释的长度

此外,关于如何将便笺创建为样本数据数组(am使用java.sound.sampled包)的任何建议都会很有帮助

框架和;采样率:44100.0hz
编码:PCM_签名


共 (2) 个答案

  1. # 1 楼答案

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

    要算出长度,取采样率并将其除以。如果我的采样率为44.1 kHz,我想要一个音符持续半秒:

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

    如果您知道音频是16位的,并且只有一个通道:

    22,050 * 2 (bytes per channel) * 1 (channels) = 44,100 bytes
    
  2. # 2 楼答案

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

    制作音频数据数组需要几个步骤。纯音的值可以通过运行数学来创建。罪恶函数。数学PI*2相当于一个完整的周期(我希望你已经知道这是非常基本的),所以使用除法来计算每一步的增量有多小

    数学的结果。sin函数是介于-1和1之间的双精度函数。您必须将此数字转换为适合分配的数据范围。这是通过将音频值乘以一个系数来实现的。例如,乘以32767将得到一个填充短符号或16位符号的范围

    从短字节到字节的转换部分取决于你是大端还是小端。此外,你还必须管理是否有多个音轨(例如,立体声很常见)。所有这些步骤都已在其他Stackoverflow帖子中介绍过

    一旦有了数据阵列,你要如何处理它,它如何与现有音频结合,部分取决于你是作为音频输出,还是试图创建一个新的wav文件来输出。Java教程的Audio Trail部分介绍了播放、保存文件,还有一部分介绍了文件格式和格式转换(强烈建议您阅读本文)