如何使用NAudio播放mp3时的当前时间?

时间:2016-09-17 15:21:56

标签: c# mp3 naudio

我有一个从url流式传输mp3的代码。我想在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);

2 个答案:

答案 0 :(得分:1)

您是否尝试过该物业的当前时间和物业位置?

mp3Reader = new Mp3FileReader("example.mp3");

waveOut.Init(mp3Reader);

waveOut.Play();

// reposition to five seconds in
mp3Reader.CurrentTime = TimeSpan.FromSeconds(5.0);

所以mp3Reader.CurrentTime应该给你我想要的东西

希望这会对你有所帮助

答案 1 :(得分:1)

我认为您需要对代码进行的唯一更改是使用waveOut.OutputWaveFormat.AverageBytesPerSecond而不是您当前使用的AvgBytesPerSec属性。 IWavePosition接口(这是您实际使用的接口)以硬件术语“思考”,因此如果您使用的格式必须在硬件使用之前进行转换,则硬件字节速率将不同比你的源字节速率。

请注意,GetPosition()返回的位置仅在自上次开始播放以来。如果调用waveOut.Stop(),则在再次开始播放时,位置将重置为0。将位置映射到源是由调用者决定的(这非常简单;只需跟踪上次在源上开始播放的位置并将其添加到返回的位置。缓冲使其更复杂,但仍然完全可行。)

我写了原始的IWavePosition界面& NAudio的实现。它在我为它构建的项目中运行良好。 :)

相关问题