我想在我的窗口手机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
感谢您的支持
任何帮助将不胜感激
答案 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中作为网页工作!音乐正在播放。我很困惑。
这里也是一个应用程序
并有评论:
如果Mp3MediaStreamSource设置为 然后是MediaElement的源代码 MediaElement不播放该文件 并且在Windows中没有显示任何错误 手机7 sdk RTM版。在previsios 它正在运行的版本,但事实并非如此 使用Windows Phone 7 sdk final 释放。