2010-01-11 41 views
8

Tôi đang tìm kiếm thành phần hiển thị dạng sóng nhanh, chuyên nghiệp và có thể tùy chỉnh trong C#.Thành phần hiển thị biểu đồ/dạng sóng chất lượng cao trong C#

Tôi muốn hiển thị chủ yếu là các dạng sóng âm thanh thời gian thực (nhanh!) Trong cả miền thời gian và tần số. Tôi muốn có khả năng thu phóng, thay đổi cài đặt trục, hiển thị nhiều kênh, tùy chỉnh cảm nhận và màu sắc, v.v ...

Bất kỳ ai biết điều gì, dù là thương mại hay không?

Cảm ơn bạn!

Diego

+0

Là người sáng lập Gigasoft, thấy chúng tôi [DirectX/Direct3D C# biểu đồ bản demo dữ liệu wav, Ví dụ 123] (http://www.gigasoft.com) Bản demo cho thấy exes trong WinForms, WPF, và C++/MFC thuần nguyên bản. Cập nhật theo thời gian thực với vị trí phát của chú thích đường thẳng đứng hiển thị 12M điểm được cập nhật liên tục mà không bị trễ. Cũng cho thấy một trục x tùy chỉnh dễ dàng của Phút: Giây. Có thể thu phóng qua chuột và chuột. – Robert

Trả lời

1

Check-out ZedGraph. Đó là một thư viện đồ họa miễn phí hoạt động rất tốt. Có rất nhiều mẫu mã trên trang web của họ cho phép bạn làm những gì bạn đang yêu cầu. Zedgraph Downloads Trang web của họ dường như đang gặp sự cố, nhưng phiên tải xuống hoạt động và chứa tất cả các tệp mẫu của họ.

1

này sẽ tạo ra dạng sóng từ tập tin âm thanh sử dụng 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; 
} 

} 
+0

Có rất nhiều biến không cần thiết, một số tính toán sai lệch trong mã của Illaya. Tôi sẽ đăng phiên bản đã được dọn dẹp, sửa đổi của tôi bên dưới vì nó quá nhiều cho hộp nhận xét. –

+0

@ DaniëlTeunkens Luôn chào mừng mã của bạn – Illaya

1

Dựa trên mã Illaya của:

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 
     { 
     } 
    } 
Các vấn đề liên quan