7

我在 C# 应用程序中使用 NAudio 库。我正在尝试将音频(* .mp3 文件)搜索到我想要的位置。但是我没有弄清楚该怎么做。

//Play the file starting from 16th second
waveStream.Seek(16, SeekOrigin.Begin);

而且......它几乎从一开始就开始播放,但不是从第 16 秒开始。我还找到了一个我认为正确的解决方案:

waveStream.Seek(waveStream.WaveFormat.AverageBytesPerSecond * 16, SeekOrigin.Begin);

似乎更接近真相。我的解决是真的还是假的?如果不是我该怎么办?

4

3 回答 3

9

您可以Position直接在 a 上设置WaveStream,它必须转换为字节偏移量 - 所以是的,将每秒平均字节数乘以秒数将使您到达正确的位置(至少对于常规 PCM WAV 文件)。WaveStream还有一个辅助属性,称为CurrentTime允许您使用 a TimeSpan,它会为您执行相同的计算。

于 2012-04-30T09:25:45.570 回答
9

如果有人仍然有这个问题并且无法弄清楚。那么这里是一个例子:

myWaveStream.CurrentTime = myWaveStream.CurrentTime.Add(new TimeSpan(0, hours, minutes, seconds, milliseconds));

myWaveStream.CurrentTime = myWaveStream.CurrentTime.Subtract(new TimeSpan(0, hours, minutes, seconds, milliseconds));
于 2013-06-17T16:21:08.577 回答
1

我使用 trackBar 创建了一个导航,每秒 4 个滴答声(250 毫秒 1 个滴答声):

trackBar1.Maximum = (int)stream.TotalTime.TotalSeconds * 4;

在每 250 毫秒调用一次的计时器滴答处理程序中,跟踪条的更新完成如下:

double ms = stream.Position * 1000.0 / output.OutputWaveFormat.BitsPerSample / output.OutputWaveFormat.Channels * 8.0 / output.OutputWaveFormat.SampleRate;
trackBar1.Value = (int) (4 * ms / 1000);

为了设置位置(滚动后),这个公式有效:

double ms = trackBar1.Value * 1000.0 / 4.0;
stream.Position = (long)(ms * output.OutputWaveFormat.SampleRate * output.OutputWaveFormat.BitsPerSample * output.OutputWaveFormat.Channels / 8000.0) & ~1;
于 2020-07-04T20:19:42.900 回答