2016-09-17 2 views
2

J'ai un code pour diffuser du mp3 depuis l'URL. Je veux montrer l'heure actuelle du lecteur mp3 dans l'interface utilisateur. Je l'ai essayé en utilisant WaveOut.GetPosition, mais cela ne pouvait pas fonctionner pour moi. Comment puis-je faire cela?Comment obtenir l'heure actuelle pendant le streaming mp3 en utilisant NAudio?

Mon code:

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

De quel type est 'provider'? –

+0

'provider' est BufferedWaveProvider,' waveOut' est WaveOut. Si vous avez besoin, je peux mettre tout le code. –

+0

Comment ça ne marche pas? Est-ce qu'il reproduit l'audio? – ioctlLR

Répondre

1

Je pense que le seul changement que vous devez faire à votre code est d'utiliser waveOut.OutputWaveFormat.AverageBytesPerSecond au lieu du AvgBytesPerSec propriété que vous utilisez actuellement. L'interface IWavePosition (que vous utilisez réellement ici) "pense" en termes matériels, donc si vous utilisez un format qui doit être converti avant que le matériel puisse l'utiliser, le taux de byte matériel sera différent de votre byte source taux.

Notez que la position renvoyée par GetPosition() est seulement depuis la dernière exécution de la lecture. Si waveOut.Stop() est appelée, la position est remise à 0 lorsque la lecture est relancée. Mapper la position à la source dépend de l'appelant (ce qui est vraiment simple, il suffit de suivre l'endroit où vous avez commencé la lecture sur la source et de l'ajouter à la position retournée, ce qui rend la tâche plus compliquée mais tout à fait faisable).

J'ai écrit l'implémentation originale de l'interface IWavePosition & pour NAudio. Cela fonctionne très bien dans le projet pour lequel je l'ai construit. :)

+0

Cela fonctionne bien. Ma valeur 'AvgBytesPerSec' était' Mp3WaveFormat.AverageBytesPerSecond' construite en utilisant les propriétés 'Mp3Frame'. Je pense que la différence est la décompression du cadre. Parce que la longueur des octets est augmentée quand une trame est décompressée. Merci pour l'aide @ioctILR. –

1

avez-vous essayé la propriété actuelle et la position de la propriété?

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

waveOut.Init(mp3Reader); 

waveOut.Play(); 

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

donc mp3Reader.CurrentTime devrait vous donner ce que vous avez besoin, je pense

Espérons que cela vous aidera

+0

mais j'ai besoin de le diffuser depuis la source de l'URL. Je sais que Mp3FileReader ne fonctionne que pour les fichiers sauvegardés. Y a-t-il une solution pour le streaming? –

+1

de codeplex 'BufferedWaveProvider.BufferedDuration', https: //github.com/naudio/NAudio/blob/master/NAudio/Wave/WaveProviders/BufferedWaveProvider.cs, en parcourant le code, vous pourriez trouver un moyen, vous pouvez également modifier le code source – Monah

+0

Il y a tellement de classes dépendantes dans le code source, mais je vais essayer. Merci pour la suggestion. –