如何获得当前的时间,而流式播放mp3使用NAudio

本文关键字:播放 mp3 NAudio 使用 何获得 时间 | 更新日期: 2023-09-27 18:07:17

我有一个代码流mp3从url。我想在UI中显示mp3播放器的当前时间。我试过用WaveOut.GetPosition,但它不能为我工作。我该怎么做呢?

我的代码:

do
 {
    //..codes to get url stream,to create BufferedWaveProvider
    int decompressed = decompressor.DecompressFrame(frame, buffer, 0);
    provider.AddSamples(buffer, 0, decompressed);
    if (provider.BufferedDuration.Seconds > 2 && waveOut == null)
    {
       waveOut = new WaveOut();
       waveOut.Init(provider);
       waveOut.Play();
    }
    if (waveOut != null)
    {
       currentTime = (int)(waveOut.GetPosition() * 1d / AvgBytesPerSec);
    }
 }
 while (bytesRead > 0 || waveOut.PlaybackState == PlaybackState.Playing);

如何获得当前的时间,而流式播放mp3使用NAudio

我认为您需要对代码进行的唯一更改是使用waveOut.OutputWaveFormat.AverageBytesPerSecond而不是您目前使用的AvgBytesPerSec属性。IWavePosition接口(这就是您在这里实际使用的)在硬件方面"认为",所以如果你使用的格式必须在硬件使用之前进行转换,那么硬件字节率将不同于源字节率。

请注意,GetPosition()返回的位置仅在上次播放开始之后。如果调用了waveOut.Stop(),当重新开始播放时,该位置将重置为0。将位置映射到源取决于调用者(这真的很简单;只需跟踪上次在源上开始播放的位置并将其添加到返回的位置。缓冲使它更复杂,但仍然是完全可行的)。

我编写了原始的IWavePosition接口&NAudio的实现。它在我构建它的项目中非常有效。:)

您是否尝试了属性当前时间和属性位置?

mp3Reader = new Mp3FileReader("example.mp3");
waveOut.Init(mp3Reader);
waveOut.Play();
// reposition to five seconds in
mp3Reader.CurrentTime = TimeSpan.FromSeconds(5.0);

所以我认为mp3Reader.CurrentTime应该能满足你的需求

希望对你有帮助