NAudio - 从指定位置寻找和导航以播放
本文关键字:导航 播放 寻找 位置 定位 NAudio | 更新日期: 2023-09-27 18:32:48
我在C#应用程序中使用NAudio库。我正在尝试将音频(*.mp3文件)寻找到我想要的位置。但是我不知道该怎么做。
//Play the file starting from 16th second
waveStream.Seek(16, SeekOrigin.Begin);
和。。。它几乎从头开始播放,但不是从第 16 秒开始播放。我还找到了一个我认为正确的解决方案:
waveStream.Seek(waveStream.WaveFormat.AverageBytesPerSecond * 16, SeekOrigin.Begin);
似乎更接近事实。我的解决是真的还是假的?如果不是,我该怎么办?
您可以
直接在WaveStream
上设置Position
,必须将其转换为字节偏移量 - 所以是的,将每秒平均字节数乘以秒数将使您到达正确的位置(至少对于常规 PCM WAV 文件)。 WaveStream
还有一个名为 CurrentTime
的帮助程序属性,允许您使用 TimeSpan
,并为您执行相同的计算。
audioFile.Position += audioFile.WaveFormat.AverageBytesPerSecond * 15;
如果有人仍然有这个问题并且无法弄清楚。那么这里有一个例子:
myWaveStream.CurrentTime = myWaveStream.CurrentTime.Add(new TimeSpan(0, hours, minutes, seconds, milliseconds));
myWaveStream.CurrentTime = myWaveStream.CurrentTime.Subtract(new TimeSpan(0, hours, minutes, seconds, milliseconds));
我使用每秒 4 个刻度的跟踪栏创建了一个导航(1 个刻度在 250 毫秒时):
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;
Winforms Trackbar Min=0 Max=100 (参见 Mark Heath ansare the Naudio- Lib 的所有者):
private void TrkbrPosition_ValueChanged(object sender, EventArgs e)
{
if (audioFile != null)
{
var lengthInBytes = audioFile.Length;
var pos = (lengthInBytes/100) * TrkbrPosition.Value;
audioFile.Position = pos;
}
}