J'essaye de dessiner une forme d'onde en utilisant ASP.net sur un site web Azure (qui n'a pas les codecs ACM ou DMO installés), donc j'ai dû utilisez NLayer pour lire le fichier mp3. Le code que j'ai ci-dessous fonctionne parfaitement avec le DmoMp3FrameDecompressor habituel, mais quand j'utilise le décompresseur NLayer, ce n'est pas le cas.C# NAudio rendu d'une forme d'onde ASP.net sans DMO ou ACM
Peut-être que le format du décompresseur NLayer est 32 bits Float et non 16 bits 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;
}
}
Merci à @Illaya pour les blocs de construction de base de ce code! http://stackoverflow.com/questions/11451707/how-to-render-audio-waveform/20190230#20190230 – Shiroy