2013-06-29 4 views
0

Я новичок в обработке wav-файла и C#. Моя цель - отображение данных в реальном времени в форме волны wavfile.I означает, что во время записи звука (wav) файл, я хочу построить график одновременно. Я искал некоторые звуковые libiraries и решил использовать NAudio. (Не знаю, что это лучший выбор для меня. Я открыт для любых предложений по выбору аудиовизуального). Однако я понятия не имею о построении данных в реальном времени с использованием звука. Некоторые люди предлагают GDI, но, как я уже сказал, я новичок, и я думаю, что это займет слишком много времени, чтобы эффективно использовать GDI. Если я должен изучить GDI, PLS поделитесь любой статьей, которая может помочь новичкам, как я. На самом деле я выгляжу так, как будто не знаю, с чего начать. Нужно руководствоваться :)) И у меня вопрос.C# в режиме реального времени с использованием NAudio

В одном из уроков NAudio он работает с байтовым массивом для построения формы сигнала в Chart.It хорошо, если вы знаете размер wav-файла. Однако он работает слишком медленно и дает исключение из памяти для больших wav-файлов чем 10mb.Код ниже относится к тому, что я имею в виду.

OpenFileDialog open = new OpenFileDialog(); 
    open.Filter = "Wave File (*.wav)|*.wav;"; 
    if (open.ShowDialog() != DialogResult.OK) return; 
    chart1.Series.Add("wave"); 
    chart1.Series["wave"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.FastLine; 
    chart1.Series["wave"].ChartArea = "ChartArea1"; 
    NAudio.Wave.WaveChannel32 wave = new NAudio.Wave.WaveChannel32(new NAudio.Wave.WaveFileReader(open.FileName)); 

    byte[] buffer = new byte[426565]; 
    int read; 
    while (wave.Position < wave.Length) 
    { 
     read = wave.Read(buffer, 0, 426565); 
     for (int i = 0; i < read/4; i++) 
     { 
      chart1.Series["wave"].Points.Add(BitConverter.ToSingle(buffer, i * 4)); 
     } 
    } 

Есть ли способ выполнить эту операцию быстрее?

+0

Как основатель Gigasoft см нашего [DirectX/Direct3D диаграмм WAV демо-данных, пример 123] (http://www.gigasoft.com) Демонстрационный показывает EXEs в WinForms, WPF и C++/MFC - чистый родной. В режиме реального времени обновляется позиция воспроизведения по вертикальной аннотации, показывающая 12M точек, постоянно обновляемых без задержки при воспроизведении и перетаскивании видового экрана и т. Д. Также показана простая пользовательская ось x минут: секунды. Масштабирование с помощью мыши и колеса мыши. Отображает масштабную рамку текущей увеличенной области и полную форму каналов. Он похож на Adobe Audition или редактор Nero wave с несколькими строками кода. – Robert

ответ

4

Если вы рисуете каждый отдельный образец, вы получите форму сигнала, которая неуправляема, поскольку звук обычно содержит много тысяч выборок в секунду. Образцы общего способа рисуются путем выбора максимального значения за определенный период времени, а затем для рисования вертикальной линии. Например, если у вас была трехминутная песня и требуется форма волны около 600 пикселей, каждый пиксель будет составлять около трети секунды. Таким образом, вы найдете наибольшее значение выборки в этой трети секунды и используете это для построения вашей формы волны.

Кроме того, в вашем примере кода вы читаете нечетное количество байтов. Но поскольку это аудио с плавающей запятой, вы всегда должны считывать кратность из четырех байтов.

+0

Благодарим вас за ответ. Я буду помнить об этом. – Blast

1

Это работало для меня

  WaveChannel32 wave = new WaveChannel32(new WaveFileReader(txtWave.Text)); 
      int sampleSize = 1024; 
      var bufferSize = 16384 * sampleSize; 
      var buffer = new byte[bufferSize]; 
      int read = 0; 
      chart.Series.Add("wave"); 
      chart.Series["wave"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.FastLine; 
      chart.Series["wave"].ChartArea = "ChartArea1"; 
      while (wave.Position < wave.Length) 
      { 
       read = wave.Read(buffer, 0, bufferSize); 
       for (int i = 0; i < read/sampleSize; i++) 
       { 
        var point = BitConverter.ToSingle(buffer, i * sampleSize); 

        chart.Series["wave"].Points.Add(point); 
       } 
      } 
+0

Как мы будем делать то же самое с файлом Webm? –

Смежные вопросы