【问题标题】:Title of current icecast streamed song当前icecast流媒体歌曲的标题
【发布时间】:2013-01-10 12:19:06
【问题描述】:

我读过一些问题,但没有一个能解决我的问题。 我制作了一个简单的客户端来通过 icecast2 服务器读取声音流。 我用以下方式读取声音:

    a = new WMPLib.WindowsMediaPlayer();
    a.URL = "http://radiolink:8000/music";
    a.controls.play();

它的作品,我听音乐。 现在我想阅读当前歌曲的标题。 我在这里发现我必须创建一个请求,例如:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://radiolink:8000/music");

            request.Headers.Clear();

            request.Headers.Add("GET", " HTTP/1.0");
            request.UserAgent = "WinampMPEG/5.09";

            request.Headers.Add("Icy-MetaData", "1");
            request.KeepAlive = true;

            WebResponse fifo = request.GetResponse();


            Console.WriteLine(fifo.Headers);

代码控制台只写输出 (content-type=audio-mpg)。 可以帮助我,并让我以正确的方式正确读取数据吗?

// 解决了第一部分。 现在我知道了:

icy-br:128,128 冰音频信息: 冰采样率=44100;冰比特率=128;冰通道=2 冰说明: 电台 fff 冰冷类型:各种冰冷名称: 广播冰酒吧:0 冰网址:http://url.com 冰元: 16000 Cache-Control: no-cache Content-Type: audio/mpeg

如何读取其他元数据?

【问题讨论】:

    标签: c# title icecast


    【解决方案1】:

    SHOUTcast/Icecast 流的元数据不在标头中,而是在实际流本身中。

    您拥有的 icy-metaint: 16000 标头是关键。每 16,000 个字节,您将获得一个元数据块。该块中的第一个字节表示元数据长度。将其值乘以 16 以获得以字节为单位的长度。一旦你这样做了,你最终会得到这样的结果:

    StreamTitle='Awesome Trance Mix - DI.fm';StreamUrl=''
    

    它将在最后填充空字节,直到达到块的长度。

    我在这里为 PHP 回答了同样的问题,但无论什么语言,概念都是一样的:Pulling Track Info From an Audio Stream Using PHP

    【讨论】:

    • 试着像你的链接一样理解套接字连接。谢谢。我下次告诉你结果
    • @devilkkw,您不需要进行直接套接字连接。您的网络请求会做得很好。重要的部分是,当您从流服务器接收响应正文时,您将元数据从实际流中分离出来。我建议使用数据包嗅探器,例如 Wireshark,并查看流。每 16,000 字节,你就会看到我所说的元区块。
    • 在 c# 中做的任何示例?
    • @devilkkw,不,抱歉。只需获取传入的字节数组,在 16,000 字节之后,读取下一个字节的长度,获取元块并将其放入自己的字节数组中,解析它,然后再读取 16,000 字节并再次执行所有操作。
    • @devilkkw,具体是什么?我目前没有方便的 Visual Studio。如果您有特定的问题,例如如何从 HTTP 响应中读取字节数组,我建议针对您要解决的特定问题发布一个不同的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2012-01-19
    • 2011-04-10
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多