2016-09-17 30 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

源代碼中有很多依賴類,但我會嘗試它。感謝您的建議。 –

相關問題