Je recherche un composant d'affichage de forme d'onde rapide et personnalisable à la recherche professionnelle et personnalisable en C #. P>
Je veux afficher principalement des formes d'onde audio en temps réel (rapide!) dans le domaine de l'heure et de la fréquence. Je voudrais la possibilité de zoomer, de modifier les paramètres de l'axe, d'afficher plusieurs canaux, de personnaliser la sensation et les couleurs, etc. p>
Quelqu'un sait quoi que ce soit, qu'il soit commercial ou non? p>
Merci! P>
Diego p>
6 Réponses :
J'ai heurté un projet de code il y a quelque temps que cela faisait cela. P>
Consultez http://www.codeproject.com/kb/miscctrl/graphiComponents. ASPX C'est peut-être ce que vous recherchez pour faire un graphique en temps réel dans .NET P>
Autant que je sache, l'instrument national a un contrôle cool, mais ce n'est pas gratuit. P>
http://sine.ni.com/psp / app / doc / p / id / psp-317 p>
Ceux libres: p>
http://www.codeproject.com/kb/audio-video /wavecontrol.aspx p>
C'est un afficheur d'écoulement d'onde p>
http://www.codeproject.com/kb/audio-video /wavecontrol.aspx p>
Vérifiez zedgraph. C'est une bibliothèque graphique gratuite qui fonctionne bien. Il y a beaucoup d'échantillons de code sur leur site Web qui vous permettent de faire ce que vous demandez. téléchargements zedgraph Leur site semble avoir des problèmes actuellement, mais la session de téléchargement fonctionne et contient tout de leurs exemples de fichiers. p>
Ceci générera une forme d'onde à partir de fichier audio à l'aide de 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; } }
Il y a beaucoup de variables superflues, certaines erreurs de calcul, etc. dans le code de l'Illaya. Je posterai ma version nettoyée et modifiée ci-dessous parce que c'est trop pour la boîte de commentaires.
@Illaya peut Naudio être utilisé pour générer un formulaire d'onde à partir d'un fichier MP4?
Basé sur le code de l'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 { } }
Le code ci-dessus peut-il être utilisé pour générer une vague à partir d'un fichier MP4?
En tant que fondateur GigaSoft, voyez notre DirectX / Direct3D C # Caractéristiques de la démonstration de données WAV, exemple 123 La démo montre Exes dans Winforms, WPF et C ++ / MFC Pure Native. En temps réel mis à jour avec la position de jeu d'annotation de ligne verticale montrant 12 m points continuellement mis à jour sans décalage. Affiche également un axe X personnalisé facile des minutes: secondes. Zoom-capable via la souris et la souris.