2016-09-17 29 views
2

我有一个代码来从URL流式传输mp3。我想在UI中显示MP3播放器的当前时间。我试过用WaveOut.GetPosition,但它不适用于我。 我该怎么做?如何使用NAudio流式传输mp3时获得当前时间?

我的代码:

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

什么类型是'提供者'? –

+0

'provider'是BufferedWaveProvider,'waveOut'是WaveOut。如果你需要,我可以把整个代码。 –

+0

它不起作用?它是否在播放音频? – ioctlLR

回答

1

我认为你需要对你的代码的唯一变化是使用waveOut.OutputWaveFormat.AverageBytesPerSecond代替AvgBytesPerSec的您目前正在使用的财产。接口(这就是你实际使用的)在硬件方面“思考”,所以如果你使用的格式必须在硬件可以使用之前进行转换,那么硬件字节速率将会与源字节有所不同率。

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

我写了NAudio的原始IWavePosition接口&实现。它在我为之打造的项目中表现出色。 :)

+0

它运作良好。我的值'AvgBytesPerSec'是'Mp3WaveFormat.AverageBytesPerSecond',它使用'Mp3Frame'属性构建。我认为不同之处在于解压缩帧。因为帧解压缩时字节长度增加。感谢您的帮助@ioctILR。 –

1

你尝试物业当前的时间和财产的地位?

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

waveOut.Init(mp3Reader); 

waveOut.Play(); 

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

所以mp3Reader.CurrentTime应该给你你需要什么,我认为

希望这将帮助你

+0

但我需要从url源流。我知道Mp3FileReader只适用于保存的文件。有流媒体解决方案吗?从codeplex'BufferedWaveProvider.BufferedDuration',https://github.com/naudio/NAudio/blob/master/NAudio/Wave/WaveProviders/BufferedWaveProvider.cs获得 –

+1

,通过浏览代码,您可能会找到一种方法,您也可以编辑源代码 – Monah

+0

源代码中有很多依赖类,但我会尝试它。感谢您的建议。 –

相关问题