如何获得当前的时间,而流式播放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);
我认为您需要对代码进行的唯一更改是使用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
应该能满足你的需求
希望对你有帮助