naudio / NAudio.WaveFormRenderer

Simple utility to render waveforms of audio files in various styles using System.Drawing

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Render Waveform for Region of Audio File

psideas opened this issue · comments

Is there a way to render a waveform based upon a region of an audio file (denoted by a startOffset and endOffset) as opposed to the entire audio file? If so, could you provide the code modifications?

it uses an AudioFileReader, so you can jump in that file with CurrentTime and you can limit the duration with the Take extension method.

reader.CurrentTime = TimeSpan.FromSeconds(30);
peakProvider.Init(reader.Take(TimeSpan.FromSeconds(20)), samplesPerPixel * stepSize);

it uses an AudioFileReader, so you can jump in that file with CurrentTime and you can limit the duration with the Take extension method.

reader.CurrentTime = TimeSpan.FromSeconds(30);
peakProvider.Init(reader.Take(TimeSpan.FromSeconds(20)), samplesPerPixel * stepSize);

Hi. Not working. "Init" creates new reader with default startTime!

             AudioFileReader reader = new AudioFileReader(audioFilePath);

            // 1. Конфигурация провайдеров
            //OffsetSampleProvider offsetSampleProvider = new OffsetSampleProvider(reader);

            MaxPeakProvider maxPeakProvider = new MaxPeakProvider();
            RmsPeakProvider rmsPeakProvider = new RmsPeakProvider(200);
            SamplingPeakProvider samplingPeakProvider = new SamplingPeakProvider(200);
            AveragePeakProvider averagePeakProvider = new AveragePeakProvider(4);

            // 2. Конфигурация стиля шкалы
            StandardWaveFormRendererSettings myRendererSettings = new StandardWaveFormRendererSettings();
            myRendererSettings.Width = waveFormWidth;
            myRendererSettings.TopHeight = formTopHeight;
            myRendererSettings.BottomHeight = formBottomHeight;

            // 3. Формирование изображения со шкалой
            WaveFormRenderer renderer = new WaveFormRenderer();

            reader.CurrentTime = TimeSpan.FromSeconds(startMediaSecond);                
            averagePeakProvider.Init(reader.Take(TimeSpan.FromSeconds(endMediaSecond - startMediaSecond)), 200);                

            image = renderer.Render(audioFilePath, averagePeakProvider, myRendererSettings); 

I append one function to this lib. Why you don't do it yet - I don't understand

        public Image RenderWithTake(string selectedFile, IPeakProvider peakProvider, 
            WaveFormRendererSettings settings, int startFromSeconds, int duration )
        {
            using (var reader = new AudioFileReader(selectedFile))
            {
                reader.CurrentTime = TimeSpan.FromSeconds(startFromSeconds);

                int bytesPerSample = (reader.WaveFormat.BitsPerSample / 8);
                var samples = reader.Length / (bytesPerSample);
                var samplesPerPixel = (int)(samples / settings.Width);
                var stepSize = settings.PixelsPerPeak + settings.SpacerPixels;
                peakProvider.Init(reader.Take(TimeSpan.FromSeconds(duration)), samplesPerPixel * stepSize);
                return Render(peakProvider, settings);
            }
        }

Wrong draw:

  1. start from 0 second to normal 1 min 59 sec
  2. start from not 0 second. No Fill.

foo_0
foo_1

Okay. This:
peakProvider.Init(reader.Take(TimeSpan.FromSeconds(duration)), samplesPerPixel * stepSize);
Contains empty peaks in the end. That's why it draws empty.
How to remove this empty peaks? "Init" creates peakProvider with full length

image
error me sale al usar StandardWaveFormRendererSettings(); error ayuda por favor

Which error? Show the full error info from IDE?