Я пытаюсь извлечь волну с использованием ASP.net на веб-сайте Azure (на котором не установлены кодеки ACM или DMO), поэтому мне пришлось используйте NLayer для чтения mp3-файла. Код, который у меня ниже, отлично работает с обычным DmoMp3FrameDecompressor, но когда я использую декомпрессор NLayer, это не так.C# NAudio, отображающий форму волны ASP.net без DMO или ACM
Возможно, формат декомпрессора NLayer - это 32-битный Float, а не 16-битный PCM.
byte[] data = new WebClient().DownloadData(URL);
int maxAmplitude = 0;
short[,] dataArray = new short[Width, 2];
//using (Mp3FileReader wavestream = new Mp3FileReader(new MemoryStream(data), wf => new DmoMp3FrameDecompressor(wf)))
using (Mp3FileReader wavestream = new Mp3FileReader(new MemoryStream(data), new Mp3FileReader.FrameDecompressorBuilder(waveFormat => new NLayer.NAudioSupport.Mp3FrameDecompressor(waveFormat))))
{
WaveChannel32 channelStream = new WaveChannel32(wavestream);
int bytesPerSample = (wavestream.WaveFormat.BitsPerSample/8) * channelStream.WaveFormat.Channels;
wavestream.Position = 0;
long lenSamples = wavestream.Length/bytesPerSample;
int samplesPerPixel = (int)(lenSamples/Width);
int bytesRead1;
byte[] waveData1 = new byte[samplesPerPixel * bytesPerSample];
// First get all the data
for (int x = 0; x < Width; x++)
{
short low = 0;
short high = 0;
bytesRead1 = wavestream.Read(waveData1, 0, samplesPerPixel * bytesPerSample);
if (bytesRead1 == 0)
break;
for (int n = 0; n < bytesRead1; n += 2)
{
short sample = BitConverter.ToInt16(waveData1, n);
if (sample < low) low = sample;
if (sample > high) high = sample;
}
if (-low > maxAmplitude) maxAmplitude = -low;
if (high > maxAmplitude) maxAmplitude = high;
dataArray[x, 0] = low;
dataArray[x, 1] = high;
}
}
Благодаря @Illaya для основных строительных блоков этого кода! http://stackoverflow.com/questions/11451707/how-to-render-audio-waveform/20190230#20190230 – Shiroy