2010-11-30 12 views
6

J'essaye d'implémenter le streaming de Shoutcast à mon MediaElement via MediaStreamSource. Voici un code avec quelques bases. Avec la méthode ReadData je peux télécharger des données audio brutes (échantillons MP3), ma question est comment puis-je définir le flux à MediaStreamSource. De cette façon, cela ne fonctionne pas (il compile et il n'y a pas d'erreur sur l'événement MediaFailed mais je n'entends aucun son). Peut-être devrais-je implémenter tout cela dans ma ShoutcastMediaStreamSource personnalisée? Il n'y a pas de problème avec le flux fixe, juste avec non-fixe. Quelqu'un peut-il me donner un conseil?WP7 Shoutcast avec MediaStreamSource

Sur le WP7, il n'est pas possible de définir "useUnsafeHeaderParsing", donc je ne peux pas obtenir les en-têtes http avec les métadonnées shoutcast - uniquement les données brutes. Dans la ShoutcastMediaStreamSource j'ai implémenté du code de ManagedMediaHelpers.

Merci

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://radiozetmp3-02.eurozet.pl:8400/;"); 
     request.Method = "GET"; 
     request.Headers["Icy-MetaData"] = "1"; 
     request.UserAgent = "WinampMPEG/5.09"; 
     request.AllowReadStreamBuffering = false; 

     request.BeginGetResponse(new AsyncCallback(RequestComplete), request); 
     allDone.WaitOne(); 

     ShoutcastMediaStreamSource smss = new ShoutcastMediaStreamSource(stream); 
     player.SetSource(smss); // MediaElement 
     player.Play(); 
    } 

    public void RequestComplete(IAsyncResult r) 
    { 
     HttpWebRequest request = (HttpWebRequest)r.AsyncState; 
     HttpWebResponse response = request.EndGetResponse(r) as HttpWebResponse; 
     stream = response.GetResponseStream(); 

     IAsyncResult res = stream.BeginRead(buffer, 0, buffer.Length, callback, null); 

     allDone.Set(); 
    } 

    public void ReadData(IAsyncResult r) 
    { 
     int bytes = stream.EndRead(r); 

     if (bytes == 0) { Debug.WriteLine("No bytes readed"); } 
     else 
     { 
      Debug.WriteLine("readed: " + buffer.Length.ToString()); 
      stream.BeginRead(buffer, 0, buffer.Length, callback, buffer); 
     } 
    } 
+0

avez-vous compris cela, j'essaye d'obtenir le quelque chose fait. Des prospects? –

+0

Juste pour les coups de pied, ne pas passer un en-tête ICY, juste utiliser HTTP régulier, et le charger avec un point-virgule dans l'URL, comme ceci: 'http: //10.12.13.14: 8000 /;' – Brad

Répondre

2

Vous devez développer MediaStreamSource personnalisé.

Vous pouvez trouver le prototype de celui que je mis au point pour un de mes projets ici: https://skydrive.live.com/redir.aspx?cid=eb0868f2135b874c&resid=EB0868F2135B874C!1037&parid=EB0868F2135B874C!169&authkey=!AGSYfCVvCasGArI

+0

Je reçois un peu sauter le son toutes les 5 secondes environ. S'il vous plaît conseiller comment nous pouvons éviter cela? –

+0

Fonctionne uniquement pour les débits de 128 bits. Autre sage, il renvoie "voix de chimpanzé" – enadun

0

Essayez version = 2 dans le code. Cela fonctionne pour moi maintenant après avoir changé une ligne de code