private int GetSilenceTime(AudioFileReader fileReader, SilenceLocation location, sbyte silenceThreshold = -20) { float[] buffer = new float[fileReader.WaveFormat.SampleRate * 4]; int result = 0; bool volumeFound = false; bool eof = false; long oldPosition = fileReader.Position; while (!volumeFound && !eof) { int samplesRead = fileReader.Read(buffer, 0, buffer.Length); if (samplesRead == 0) { eof = true; } for (int i = 0; i < samplesRead; i++) { if (!IsSilence(buffer[i], silenceThreshold)) { result = (int)fileReader.Position - (samplesRead - i) * 4; if (location == SilenceLocation.Start) { volumeFound = true; break; } } } } fileReader.Position = oldPosition; return(result); }
public static TimeSpan GetSilenceDuration(AudioFileReader reader, SilenceLocation location, sbyte silenceThreshold = -20) { int counter = 0; bool volumeFound = false; bool eof = false; long oldPosition = reader.Position; var buffer = new float[reader.WaveFormat.SampleRate * 4]; while (!volumeFound && !eof) { int samplesRead = reader.Read(buffer, 0, buffer.Length); if (samplesRead == 0) { eof = true; } for (int n = 0; n < samplesRead; n++) { if (IsSilence(buffer[n], silenceThreshold)) { counter++; } else { if (location == SilenceLocation.Start) { volumeFound = true; break; } else if (location == SilenceLocation.End) { counter = 0; } } } } // reset position reader.Position = oldPosition; double silenceSamples = (double)counter / reader.WaveFormat.Channels; double silenceDuration = (silenceSamples / reader.WaveFormat.SampleRate) * 1000; return(TimeSpan.FromMilliseconds(silenceDuration)); }