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 withCurrentTime
and you can limit the duration with theTake
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);
}
}
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
Which error? Show the full error info from IDE?