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);

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

NAudio - 从指定位置寻找和导航以播放

您可以

直接在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;
        }
    }