我有一个SL4项目,可以从远程位置成功传输出色的WMA音频流。所有MediaElement行动都是直截了当的。
我想要做的是阅读作为文本传递的属性以及音频流。例如,流的编码器嵌入流的标题,播放歌曲的标题以及当前歌曲的艺术家名称。
如何使用Silverlight 4将其选出,然后将其显示在用户的标签中?
这肯定比编写一堆Web服务更容易做同样的事情。 Windows Media Player和WinAmp都获取了我在MediaElement对象集合中看不到的信息。
答案 0 :(得分:1)
我在搜索网页后也找到了答案,同时也轻易摆弄了表达式3。
事实证明,实时音频流具有发送的标记以及音频。标记几乎可以包含任何东西,但其中一个称为“标题”。标题基本上是一个自由格式的字符串字段,您可以阅读。使用我的流,编码器会将大量信息作为标题发送,然后可以将其分解。所以这是我正在使用的代码:
从注册一些事件开始,最后一个是重要事件。
public MainPage()
{
InitializeComponent();
this.mediaElement1.BufferingProgressChanged += new RoutedEventHandler(mediaElement1_BufferingProgressChanged);
this.mediaElement1.MarkerReached += new TimelineMarkerRoutedEventHandler(mediaElement1_MarkerReached);
}
然后实际的标记处理程序执行以下操作:
private void mediaElement1_MarkerReached(object sender, TimelineMarkerRoutedEventArgs e)
{
Dictionary<string, string> songAttribs = new Dictionary<string, string>();
string playerFeed = HttpUtility.UrlDecode(e.Marker.Text);
char[] delims = { '&' };
string[] Attribs = playerFeed.Split(delims);
foreach (String attrib in Attribs)
{
string[] keypair = attrib.Split('=');
string key = "";
string value = "";
try
{
key = keypair[0];
}
catch
{
key = null;
}
if (key != null)
{
try
{
value = keypair[1];
}
catch
{
value = "";
}
songAttribs.Add(keypair[0], keypair[1]);
}
}
nowplaying.Title = songAttribs["title"];
nowplaying.Artist = songAttribs["artist"];
nowplaying.Duration = 0;
this.label2.Content = "Artist: " + nowplaying.Artist;
this.label3.Content = "Title: " + nowplaying.Title;
this.label1.Content = playerFeed;
}
仍在处理一些代码,但到目前为止,似乎工作正常。
答案 1 :(得分:-1)
Mayba WMP和WinAmp从网站或类似的内容中获取信息,并且不会从流中读取...
Werewolve