我有一个从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);
答案 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的实现。它在我为它构建的项目中运行良好。 :)