【发布时间】:2016-09-17 15:21:56
【问题描述】:
我有一个从 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);
【问题讨论】:
-
provider是什么类型? -
provider是 BufferedWaveProvider,waveOut是 WaveOut。如果你需要,我可以放整个代码。 -
怎么不工作了?它是否在播放音频?
-
它返回的数字太大。我在想它显示了提供者的读取位置,但事实并非如此。另外
BufferedWaveProvider是从CircularBuffer派生的,因此它本身会循环,并且不能包含像普通流或缓冲区这样的位置。我找不到正确的公式来使用GetPosition计算当前时间。所以我目前正在使用仅在WaveOut.PlaybackState == PlaybackState.Playing的情况下运行的 Timer.Tick 来计算时间位置。