WP7 Shoutcast с MediaStreamSource - PullRequest
       38

WP7 Shoutcast с MediaStreamSource

6 голосов
/ 01 декабря 2010

Я пытаюсь реализовать потоковую передачу Shoutcast на мой MediaElement через MediaStreamSource. Вот код с некоторыми основами. С помощью метода ReadData я могу загружать необработанные аудиоданные (сэмплы MP3), мой вопрос заключается в том, как установить поток MediaStreamSource. Таким образом, он не работает (он компилируется, и в событии MediaFailed нет ошибок, но я не слышу ни звука). Может быть, я должен реализовать все это в моем собственном ShoutcastMediaStreamSource? Нет проблем с фиксированным потоком, только с нефиксированным. Может кто-нибудь дать мне совет?

В WP7 нет возможности установить «useUnsafeHeaderParsing», поэтому я не могу получить заголовки http с метаданными shoutcast - только необработанные данные. В ShoutcastMediaStreamSource я реализовал некоторый код ManagedMediaHelpers.

Спасибо

    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);
        }
    }

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

Вам необходимо разработать собственный MediaStreamSource.

Вы можете найти прототип того, который я разработал для одного из моих проектов, здесь: https://skydrive.live.com/redir.aspx?cid=eb0868f2135b874c&resid=EB0868F2135B874C!1037&parid=EB0868F2135B874C!169&authkey=!AGSYfCVvCasGArI

0 голосов
/ 03 декабря 2013

Попробуйте версию = 2 в коде.Теперь у меня работает после изменения одной строки кода

...