Windows Phone7上的ShoutCast的HttpWebRequest

时间:2010-09-17 11:21:47

标签: httpwebrequest windows-phone-7 shoutcast

我想在我的窗口手机7应用程序中播放shoutcast流

我像这样启动异步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,

在这种情况下的问题是,由于endelss shoutcast流,它从不调用结束OpenReadCompleted

感谢您的支持

任何帮助将不胜感激

4 个答案:

答案 0 :(得分:3)

SHOUTcast实现了自己的协议,因此您无法直接访问和播放它。您可以使用DownloadStringAsync(您需要 WebClient 实例)下载 PLS 文件,并在RegEx的帮助下阅读该网址。

获取网址后,您可以通过实施MediaStreamSource来阅读原始音频数据,然后使用MediaElement播放内容。

您可以找到 MediaStreamSource here的示例实现。

答案 1 :(得分:1)

我只是将以下内容放在页面上,然后在repsonse中调用回调按钮单击。 (我在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();
    }

答案 2 :(得分:0)

如果禁用读取流缓冲,则会调用回调:

webRequest.AllowReadStreamBuffering = false;

答案 3 :(得分:0)

我正在尝试通过我自己的MediaStreamSource类实现Shoutcast流媒体到我的MediaElement。我有一个循环,我从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。所以当我在debbuger中将这个流放到我的ShoutcastMediaStreamSource时,我可以看到正确调用 OpenMediaAsync()方法,然后通过MediaElement在循环中调用 GetSampleAsync() ,这里一切都很好,但是当我运行这个应用程序时,没有声音!无论是在仿真器上还是在设备上,都没有错误。我认为,GetSampleAsync()方法运行得太快,因为文件(以及流)的持续时间大约是30秒,并且此应用程序在大约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中没有显示任何错误   手机7 sdk RTM版。在previsios   它正在运行的版本,但事实并非如此   使用Windows Phone 7 sdk final   释放。