从Java的框架ArrayList创建wav文件

时间:2019-05-28 13:55:49

标签: java arraylist buffer wav

我已经创建了读取wav文件并计算每帧平均能量(RMS)的代码。

然后,代码将所有超出能量阈值的框架帧值汇总的事件存储在Doubles的ArrayList中:

   ArrayList<Double> significantEvent = new ArrayList<Double>();

每次在arrayList中读取1个或多个连续帧(组成一个事件)时,该事件就会被添加到下面的ArrayLists的ArrayList中,然后清除以读取下一组要读取的帧。

  ArrayList<ArrayList<Double>> significantEventCollect = new ArrayList<ArrayList<Double>>();

最终,Arraylists(事件)的ArrayList已完成。

例如,我当前正在测试的wav文件具有5个事件,涉及不同数量的帧:

1   0.014028881507583106

2   0.028595488574905577
    0.04831942513880609
    0.018766566401686773

3   0.030843206764955628
    0.05321395077844886
    0.023906227291973788

4   0.027806758400863583
    0.04300524255389825
    0.020790246307126208

5   0.028774597939793384
    0.04015144549339461
    0.022221963876695557

现在我想回放这些事件,我认为需要通过为每个事件创建新的wav文件来完成。

但是,我不确定我是否有足够的信息来执行此操作,并且找不到具有少量帧的ArrayList可以执行此操作的代码。

我从以下来源找到了代码:http://www.labbookpages.co.uk/audio/javaWavFiles.html

并试图使用此站点中的代码来编写wav文件,但是我不确定如何将其用于我拥有的数据:

         int sampleRate = 44100;    // Samples per second
         double duration = event.size()/sampleRate ;     // Seconds

         // Calculate the number of frames required for specified duration
         long numFrames = (long)(duration * sampleRate);

         // Create a wav file with the name specified as the first argument
         WavFile wavFile = WavFile.newWavFile(new File(fileName + ".wav"), 2, numFrames, 16, sampleRate);

         // Create a buffer of 100 frames
         double[][] buffer = new double[1][(int) numFrames];

         // Initialise a local frame counter
         long frameCounter = 0;

         // Loop until all frames written
         while (frameCounter < numFrames)
         {
            // Determine how many frames to write, up to a maximum of the buffer size
            long remaining = wavFile.getFramesRemaining();
            int toWrite = (int) ((remaining > numFrames) ? numFrames : (int) remaining);

            // Fill the buffer, one tone per channel
            for (int s=0 ; s<toWrite ; s++, frameCounter++)
            {
               buffer[0][s] = Math.sin(2.0 * Math.PI * 400 * frameCounter / sampleRate);
               buffer[1][s] = Math.sin(2.0 * Math.PI * 500 * frameCounter / sampleRate);
            }

            // Write the buffer
            wavFile.writeFrames(buffer, toWrite);
         }

我很难用自己的数据填充此代码中的缓冲区。

对于我接下来要从框架值块中创建wav文件的任何建议,将不胜感激。

0 个答案:

没有答案