问题描述
我发生了以下事情:
public static List<List<float>> int_filenamewavedataRight = new List<List<float>>();
从那里我打开一个音频文件并在此数组中加载音频电平值,这样我就可以通过naudio库正确查看它们。
对于新文件,我像这样清除数组:
int_filenamewavedataRight.Clear();
int_filenamewavedataRight.Add(new List<float>());
waveStream.Position = 0;
int bytesRead;
byte[] waveData = new byte[bytesPerSample];
waveStream.Position = 0; // startPosition + (e.ClipRectangle.Left * bytesPerSample * samplesPerPixel);
int samples = (int)(waveStream.Length / bytesPerSample);
wavepeakloaded = 0;
int OldPrecentVal = 0;
for (int x = 0; x < samples; x++)
{
short high = 0;
bytesRead = waveStream.Read(waveData,bytesPerSample);
if (bytesRead == 0)
break;
for (int n = 0; n < bytesRead; n += 2)
{
short sample = BitConverter.ToInt16(waveData,n);
if (sample > high) high = sample;
}
float highPercent2 = (float)Math.Round(((((float)high) - short.MinValue) / ushort.MaxValue),2);
// ERRORING HERE
// ERRORING HERE
int_filenamewavedataRight[filename_value].Add((float)Math.Round(highPercent2,2));
// ERRORING HERE
// ERRORING HERE
}
典型的歌曲长度为5分钟的小音频文件是可以的,但是25分钟或更长的较长的音频文件在计数67108864时会产生异常,然后我得到“系统类型为异常”。抛出了OutOfMemoryException”。
x = {"Exception of type 'System.OutOfMemoryException' was thrown."}
ex.StackTrace " at System.Collections.Generic.List`1.set_Capacity(Int32 value)\r\n at System.Collections.Generic.List`1.EnsureCapacity(Int32 min)\r\n at System.Collections.Generic.List`1.Add(T item)\r\n at APP.WaveViewer.LoadWavetoMemory(Int32 filename_value) in WaveViewer.cs:line 1391"
我正在使用列表的列表,以便可以像简单数组一样处理音频文件,但是由于我不知道数组的初始大小,因此可以初始指定大小。
我还要像这样预先加载波形数据,以便可以同时播放,缩放和平移音频文件。
这是容易修复的吗,还是我应该找到另一种方法,例如将这些峰值量值写入临时文件,而不是将其保留在内存中,或者有更好的方法吗?
我已经在网上的各个地方(例如here)进行了查找,但是,这样做似乎很罕见。
谢谢。
解决方法
简单的答案是它运行在32位(x86)上,没有足够的分配空间来容纳5000万个以上的样本。
相反,将程序更改为x64可以解决该特定问题。
这就是我喜欢SO的地方,在那里您可以从这么多人那里汇集资源并在提出问题时学习。