2016-09-16 2 views
0

J'essaie de faire un lecteur mp3 en streaming. Le fichier mp3 qui est sur la source internet peut être joué en temps réel dans ce projet. Aussi je veux le faire soutenir Pause, Stop, Forward, Backward. Pour obtenir ces fonctionnalités, j'ai besoin d'écrire un lecteur flexible.NAudio Mp3Frame est null tout en streaming mp3

J'ai donc écrit ce code:

WaveOut outer; 
    AcmMp3FrameDecompressor decompressor; 
    BufferedWaveProvider provider; 
    public void Play() 
    { 
     Task.Run(() => 
     { 
      var response = WebRequest.Create(url).GetResponse(); 
      var responseStream = response.GetResponseStream(); 
      Mp3Frame frame; 
      byte[] buffer = new byte[30000]; 
      int bytesRead = 0; 
      MemoryStream ms = new MemoryStream(); 
      ReadFullyStream fully = new ReadFullyStream(ms); 

      do 
      { 
       bytesRead = responseStream.Read(buffer, 0, buffer.Length); 
       ms.Write(buffer, 0, bytesRead); 

       frame = Mp3Frame.LoadFromStream(fully); 
       if (decompressor == null) 
       { 
        decompressor = CreateFrameDecompressor(frame) as AcmMp3FrameDecompressor; 
        provider = new BufferedWaveProvider(decompressor.OutputFormat); 
        provider.BufferDuration = TimeSpan.FromSeconds(50); 
        outer = new WaveOut(); 
        outer.Init(provider); 
        outer.Play(); 
       } 
       int decompressed = decompressor.DecompressFrame(frame, buffer, 0); 
       provider.AddSamples(buffer, 0, decompressed); 
      } 
      while (bytesRead > 0); 
     }); 

    } 

Dans le code ci-dessus, il lance une exception en raison du cadre est nul. Cela signifie que LoadMp3FromStream ne fonctionne pas pour MemoryStream. Comment puis-je le réparer?

Répondre

1

Si vous obtenez une image MP3 nulle, cela signifie simplement qu'elle n'a pas trouvé de trame MP3 dans les données d'entrée. Donc, vous êtes sûr que c'est MP3 valide que vous passez.

Aussi, vous voudrez peut-être vérifier mon blog sur playing streaming MP3 et voir si ce code fonctionne pour votre fichier.

+0

J'ai implémenté ce code avec les changements de 'Mp3StreamingDemo/MP3StreamingPanel.cs'. Le problème ici est résolu en supprimant ReadFullyStream et en repositionnant MemoryStream. J'ai oublié la question à supprimer, désolé. Maintenant, j'ai une question plus importante liée à la mémoire en utilisant le streaming. Je serais reconnaissant si vous jetez un oeil à http://stackoverflow.com/questions/39544929/how-to-stream-an-mp3-file-from-a-url-without-using-much-ram. Merci @Mark. –