我已经创建了读取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文件的任何建议,将不胜感激。