HttpWebRequest для ShoutCast на Windows Phone7 - PullRequest
3 голосов
/ 17 сентября 2010

Я пытаюсь транслировать поток shoutcast в моем приложении Windows Phone 7

Я запускаю такой асинхронный HttpWebRequest

//Init Request

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://ACommonoShoutCastUrl:8000");

myHttpWebRequest.Headers["Icy-MetaData"] = "1";

myHttpWebRequest.UserAgent = "WinampMPEG/5.09";

myHttpWebRequest.AllowReadStreamBuffering = true;

//Call

 // Create an instance of the RequestState and assign the previous myHttpWebRequest object to its request field.  

RequestState myRequestState = new RequestState();

 myRequestState.request = myHttpWebRequest;

 // Start the asynchronous request.

 IAsyncResult result = (IAsyncResult)myHttpWebRequest.BeginGetResponse(new AsyncCallback(RespCallBack), myRequestState);

Проблема в том, что CallBack-> RespCallBack никогда не вызывается...

Этот код работал для меня нормально в других средах, но не на телефоне ...

Я устал также использовать WebClient, который, кажется, для потоковой передачи данных,

проблема в этом случае состоит в том, что он никогда не вызывает конец OpenReadCompleted из-за потока shoutcast endelss

Спасибо за поддержку

любая помощь будет оценена

Ответы [ 4 ]

3 голосов
/ 18 сентября 2010

SHOUTcast реализует свой собственный протокол, поэтому вы не можете напрямую получить к нему доступ и воспроизвести его. Вы можете использовать DownloadStringAsync (для этого вам понадобится экземпляр WebClient ), чтобы загрузить файл PLS и прочитать URL-адрес с помощью RegEx.

Получив URL-адрес, вы можете прочитать необработанные аудиоданные, реализовав MediaStreamSource , а затем использовать MediaElement для воспроизведения содержимого.

Пример реализации MediaStreamSource можно найти здесь .

1 голос
/ 18 сентября 2010

Я просто разместил следующее на странице, и ответный вызов был вызван в ответ на нажатие кнопки. (Я установил точку останова в операторе throw, и он был достигнут.)

    private HttpWebRequest myHttpWebRequest;

    public MainPage()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //Init Request 
        //The following URI was chosen at random
        myHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://yp.shoutcast.com/sbin/tunein-station.pls?id=1377200");
        myHttpWebRequest.Headers["Icy-MetaData"] = "1";
        myHttpWebRequest.UserAgent = "WinampMPEG/5.09";
        myHttpWebRequest.AllowReadStreamBuffering = true;

        // Start the asynchronous request.
        myHttpWebRequest.BeginGetResponse(RespCallBack, myHttpWebRequest);
    }

    private void RespCallBack(IAsyncResult ar)
    {
        throw new NotImplementedException();
    }
0 голосов
/ 03 декабря 2010

Я пытаюсь реализовать потоковую передачу Shoutcast на мой MediaElement через мой собственный класс MediaStreamSource.У меня есть цикл, в котором я загружаю данные с сервера Shoutcast, а затем задаю данные для класса MediaStreamSource - пока это работает не идеально, но я обнаружил еще одну более важную проблему.Я сделал тест.Я загрузил поток в файл mp3 (поток в mp3), затем поместил этот файл в свое приложение и установил его в MediaStreamSource.Вот код для этого:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var assembly = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
    var res = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("Demo1.sample.mp3");

    byte[] data = new byte[res.Length];
    res.Read(data, 0, data.Length);

    MemoryStream ms = new MemoryStream();
    ms.Write(data, 0, data.Length);
    ms.Position = 0;

    ShoutcastMediaStreamSource ss = new ShoutcastMediaStreamSource(ms);
    player.SetSource(ss);             
}

мой ShoutcastMediaStreamSource, основанный на MenagedMediaHelpers.Поэтому, когда я помещаю этот поток в мой ShoutcastMediaStreamSource в debbuger, я вижу, что метод OpenMediaAsync () вызывается правильно, тогда GetSampleAsync () вызывается в цикле MediaElement, здесьтоже все хорошо, но при запуске этого приложения нет звука!Ни на эмуляторе, ни на устройстве, и ошибок нет.Я думаю, что метод GetSampleAsync () работает слишком быстро, потому что продолжительность файла (а также потока) составляет около 30 секунд, и это приложение завершается через ок.10 секНо, тем не менее, должен быть звук (царапина).

НО, что удивительно - это приложение работает в Silverlight как веб-страница! Музыка играет.Я в замешательстве.

Вот также приложение

http://timheuer.com/blog/archive/2010/08/16/download-and-store-media-for-playback-in-windows-phone-7-using-mediastreamsource.aspx

и есть комментарий:

Если Mp3MediaStreamSource установлен какисточник MediaElement, то MediaElement не воспроизводит этот файл и не показывает никаких ошибок в Windows Phone 7 SDK RTM версии.В предыдущей версии он работал, но не работает с финальным выпуском SDK для Windows Phone 7.

0 голосов
/ 30 ноября 2010

Обратный вызов вызывается, если вы отключите буферизацию потока чтения:

webRequest.AllowReadStreamBuffering = false;
...