3

我试图在我的 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 因为 endelss 喊播流

谢谢你的支持

任何帮助,将不胜感激

4

4 回答 4

3

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

获取 URL 后,您可以通过实现MediaStreamSource读取原始音频数据,然后使用MediaElement播放内容。

您可以在此处找到MediaStreamSource 的示例实现。

于 2010-09-18T19:20:27.473 回答
1

I just put the following on a page and the callback was called in repsonse to the button click. (I set a break point on the throw statement and it was hit.)

    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();
    }
于 2010-09-17T21:13:59.623 回答
0

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

webRequest.AllowReadStreamBuffering = false;
于 2010-11-30T19:46:24.933 回答
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。因此,当我将此流放到调试器中的 ShoutcastMediaStreamSource 时,我可以看到OpenMediaAsync()方法被正确调用,然后由 MediaElement 在循环中调用GetSampleAsync(),这里也一切正常,但是当我在那里运行这个应用程序时是没有声音!无论是在模拟器上还是在设备上,都没有错误。我认为,GetSampleAsync() 方法运行速度太快,因为文件(以及流)持续时间约为 30 秒,并且此应用程序在 ca 之后结束。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 版本中显示任何错误。在 previsios 版本中它可以工作,但它不适用于 Windows phone 7 sdk 最终版本。

于 2010-12-03T16:32:47.373 回答