使用Silverlight 4从实时音频流中读取歌曲标题/艺术家?

时间:2010-05-05 18:02:35

标签: c# silverlight audio streaming silverlight-4.0

我有一个SL4项目,可以从远程位置成功传输出色的WMA音频流。所有MediaElement行动都是直截了当的。

我想要做的是阅读作为文本传递的属性以及音频流。例如,流的编码器嵌入流的标题,播放歌曲的标题以及当前歌曲的艺术家名称。

如何使用Silverlight 4将其选出,然后将其显示在用户的标签中?

这肯定比编写一堆Web服务更容易做同样的事情。 Windows Media Player和WinAmp都获取了我在MediaElement对象集合中看不到的信息。

2 个答案:

答案 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

相关问题