Componente di visualizzazione grafico / forma d’onda di alta qualità in C #

Sto cercando un componente di visualizzazione della forma d’onda veloce, professionale e personalizzabile in C #.

Sto cercando di visualizzare principalmente forms d’onda audio in tempo reale (veloci!) Nel dominio del tempo e della frequenza. Mi piacerebbe la possibilità di zoomare, cambiare le impostazioni dell’asse, visualizzare più canali, personalizzare la sensazione e i colors ecc …

Qualcuno sa di qualsiasi cosa, commerciale o no?

Grazie!

Diego

    Mi sono imbattuto in un progetto di codice qualche tempo fa che stava facendo questo.

    Scopri http://www.codeproject.com/KB/miscctrl/GraphComponents.aspx potrebbe essere quello che stai cercando per fare grafici in tempo reale in.

    per quanto ne so, lo strumento nazionale ha un controllo interessante, ma non è gratuito.

    http://sine.ni.com/psp/app/doc/p/id/psp-317

    quelli gratuiti:

    http://www.codeproject.com/KB/audio-video/wavecontrol.aspx

    Quello è un visualizzatore di stream d’onda

    http://www.codeproject.com/KB/audio-video/wavecontrol.aspx

    Dai un’occhiata a Zedgraph. È una libreria grafica gratuita che funziona alla grande. Ci sono molti esempi di codice sul loro sito web che ti permettono di fare ciò che stai chiedendo. Download di Zedgraph Il loro sito sembra avere problemi in questo momento, ma la sessione di download funziona e contiene tutti i file di esempio.

    Questo genererà forms d’onda da file audio usando nAudio …

    using NAudio.Wave; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string strPath = Server.MapPath("audio/060.mp3"); string SongID = "2"; byte[] bytes = File.ReadAllBytes(strPath); WriteToFile(SongID,strPath, bytes); Response.Redirect("Main.aspx"); } private void WriteToFile(string SongID, string strPath, byte[] Buffer) { try { int samplesPerPixel = 128; long startPosition = 0; //FileStream newFile = new FileStream(GeneralUtils.Get_SongFilePath() + "/" + strPath, FileMode.Create); float[] data = FloatArrayFromByteArray(Buffer); Bitmap bmp = new Bitmap(1170, 200); int BORDER_WIDTH = 5; int width = bmp.Width - (2 * BORDER_WIDTH); int height = bmp.Height - (2 * BORDER_WIDTH); NAudio.Wave.Mp3FileReader reader = new NAudio.Wave.Mp3FileReader(strPath, wf => new NAudio.FileFormats.Mp3.DmoMp3FrameDecompressor(wf)); NAudio.Wave.WaveChannel32 channelStream = new NAudio.Wave.WaveChannel32(reader); int bytesPerSample = (reader.WaveFormat.BitsPerSample / 8) * channelStream.WaveFormat.Channels; using (Graphics g = Graphics.FromImage(bmp)) { g.Clear(Color.White); Pen pen1 = new Pen(Color.Gray); int size = data.Length; string hexValue1 = "#009adf"; Color colour1 = System.Drawing.ColorTranslator.FromHtml(hexValue1); pen1.Color = colour1; Stream wavestream = new NAudio.Wave.Mp3FileReader(strPath, wf => new NAudio.FileFormats.Mp3.DmoMp3FrameDecompressor(wf)); wavestream.Position = 0; int bytesRead1; byte[] waveData1 = new byte[samplesPerPixel * bytesPerSample]; wavestream.Position = startPosition + (width * bytesPerSample * samplesPerPixel); for (float 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; } float lowPercent = ((((float)low) - short.MinValue) / ushort.MaxValue); float highPercent = ((((float)high) - short.MinValue) / ushort.MaxValue); float lowValue = height * lowPercent; float highValue = height * highPercent; g.DrawLine(pen1, x, lowValue, x, highValue); } } string filename = Server.MapPath("image/060.png"); bmp.Save(filename); bmp.Dispose(); } catch (Exception e) { } } public float[] FloatArrayFromStream(System.IO.MemoryStream stream) { return FloatArrayFromByteArray(stream.GetBuffer()); } public float[] FloatArrayFromByteArray(byte[] input) { float[] output = new float[input.Length / 4]; for (int i = 0; i < output.Length; i++) { output[i] = BitConverter.ToSingle(input, i * 4); } return output; } } 

    Basato sul codice di Illaya:

     public void CreateWaveForm(string audioFilePath, string audioWaveFormFilePath) { try { int bytesPerSample = 0; using (NAudio.Wave.Mp3FileReader reader = new NAudio.Wave.Mp3FileReader(audioFilePath, wf => new NAudio.FileFormats.Mp3.DmoMp3FrameDecompressor(wf))) { using (NAudio.Wave.WaveChannel32 channelStream = new NAudio.Wave.WaveChannel32(reader)) { bytesPerSample = (reader.WaveFormat.BitsPerSample / 8) * channelStream.WaveFormat.Channels; //Give a size to the bitmap; either a fixed size, or something based on the length of the audio using (Bitmap bitmap = new Bitmap((int)Math.Round(reader.TotalTime.TotalSeconds * 40), 200)) { int width = bitmap.Width; int height = bitmap.Height; using (Graphics graphics = Graphics.FromImage(bitmap)) { graphics.Clear(Color.White); Pen bluePen = new Pen(Color.Blue); int samplesPerPixel = (int)(reader.Length / (double)(width * bytesPerSample)); int bytesPerPixel = bytesPerSample * samplesPerPixel; int bytesRead; byte[] waveData = new byte[bytesPerPixel]; for (float x = 0; x < width; x++) { bytesRead = reader.Read(waveData, 0, bytesPerPixel); if (bytesRead == 0) break; short low = 0; short high = 0; for (int n = 0; n < bytesRead; n += 2) { short sample = BitConverter.ToInt16(waveData, n); if (sample < low) low = sample; if (sample > high) high = sample; } float lowPercent = ((((float)low) - short.MinValue) / ushort.MaxValue); float highPercent = ((((float)high) - short.MinValue) / ushort.MaxValue); float lowValue = height * lowPercent; float highValue = height * highPercent; graphics.DrawLine(bluePen, x, lowValue, x, highValue); } } bitmap.Save(audioWaveFormFilePath); } } } } catch { } }