Entwickler-Ecke

WPF / Silverlight - MP3 in Silverlight von URL abspielen geht nicht


alegria - Fr 29.10.10 13:21
Titel: MP3 in Silverlight von URL abspielen geht nicht
Hey!

Ich bin am verzweifeln weil ich so ein triviales Problem nicht hinbekomme und ich im Netzt keine hilfreichen Lösungen finden kann...

Problem:
In einer Silverlight 4 Anwendung soll ein MP3 von einer Website abgespielt werden.

Code:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
        {
            mediaElement1.Source = new Uri("http://mp3.podcast.hr-online.de/mp3/podcast/derTag/derTag_20101028.mp3", UriKind.Absolute);
            mediaElement1.Play();
        }

        private void mediaElement1_MediaFailed(object sender, ExceptionRoutedEventArgs e)
        {

            MessageBox.Show(e.ErrorException.ToString());
        }


Fehler:
System.Exception: 4001 AG_E_NETWORK_ERROR


Zu dem Fehler findet man zwar einiges, aber alles nicht brauchbar! Was mach ich falsch bzw. wie muss man es richtig machen??? Geht überhaupt MP3 abspielen wenn das FIle nicht lokal liegt?
(also download von dem file und dann mediaElement1.Source = new Uri("derTag_20101028.mp3", UriKind.Relative); funktioniert einwandfrei... Das MP3-Format kann es daher schon mal nciht sein...


alegria - Sa 30.10.10 07:34

Ist das Problem tatsächlich so kompliziert??? Kann man denn nicht in irgendeiner Form mit Silverlight MP3 von einem entfernten Rechner abspielen?


Christian S. - Sa 30.10.10 11:44

Ich würde sagen, Du läufst in dieses Problem hier: http://www.c-sharp-forum.de/viewtopic.php?t=100228&highlight=security


alegria - Mo 01.11.10 13:04

Yo! Das wars... Hatte als Silverlight Newbie davon auch bisher null Ahnung gehabt weshalb ich mal als Art "Tutorial" (für alle anderen die ähnliche Probleme haben (werden)...) hier die Lösung beschreibe. Vielen Dank für die Hilfe!

1) Auf dem Zielwebserver eine clientaccesspolicy.xml erstellen.
(bei mir war das per root (LAMPP) folgende Datei (chmod 644) nach /srv/www/htdocs schreiben...)

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from>      
        <domain uri="*"/>
      </allow-from>      
      <grant-to>      
        <resource path="/" include-subpaths="true"/>
      </grant-to>      
    </policy>
  </cross-domain-access>
</access-policy>


2) C#-Code (Button, Progressbar, Mediaelement)

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
private void btn_play_Click(object sender, RoutedEventArgs e)
{
    WebClient wcl = new WebClient();
    wcl.OpenReadCompleted += new OpenReadCompletedEventHandler(_downloadFertig);
    wcl.DownloadProgressChanged += new DownloadProgressChangedEventHandler(_downloadProgress);
    wcl.OpenReadAsync(new Uri("http://blabla.com/bla/eins zwei.mp3", UriKind.Absolute));
}

private void _downloadProgress(object sender, DownloadProgressChangedEventArgs e)
{
    progressBar1.Value = (double)e.ProgressPercentage;
}

private void _downloadFertig(object sender, OpenReadCompletedEventArgs e) {
    try
    {
        mediaElement1.SetSource(e.Result);
        mediaElement1.Play();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}


3) Freuen! :)