Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Streaming 从流式广播获取信息_Streaming_Audio Streaming_Internet Radio - Fatal编程技术网

Streaming 从流式广播获取信息

Streaming 从流式广播获取信息,streaming,audio-streaming,internet-radio,Streaming,Audio Streaming,Internet Radio,有一些标准方法可以询问流媒体广播服务当前播放的歌曲? 我目前为每个电台采用不同的方式,例如(SomaFM): $wg=join(“\n”,`wget-q-O-https://somafm.com/secretagent/songhistory.html`); $wg=~/\(Now\).>([^([^对于具有ICE元数据的SHOUTcast/Icecast风格的电台(构成互联网广播电台的大部分),最好的办法是从流本身获取这些数据 首先,您需要实际流的URL。如果您转到SomaFM的Secret

有一些标准方法可以询问流媒体广播服务当前播放的歌曲? 我目前为每个电台采用不同的方式,例如(SomaFM):

$wg=join(“\n”,`wget-q-O-https://somafm.com/secretagent/songhistory.html`);

$wg=~/\(Now\).>([^([^对于具有ICE元数据的SHOUTcast/Icecast风格的电台(构成互联网广播电台的大部分),最好的办法是从流本身获取这些数据

首先,您需要实际流的URL。如果您转到SomaFM的Secret Agent页面,您将看到其他播放机中侦听的链接。例如,让我们使用指向的128k AAC链接。这不是实际流…它是一个包含实际流链接的播放列表文件。请在您喜爱的文本或代码编辑器中打开它以查看我的意思是:

[playlist]
numberofentries=2
File1=http://ice1.somafm.com/secretagent-128-aac
Title1=SomaFM: Secret Agent (#1  ): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too!
Length1=-1
File2=http://ice2.somafm.com/secretagent-128-aac
Title2=SomaFM: Secret Agent (#2  ): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too!
Length2=-1
Version=2
Internet无线电台通常在此处包含多个用于故障切换的服务器。如果侦听器与其中一个服务器断开连接,播放机通常会转到下一个项目。当一个服务器达到其侦听器限制时,这也很有用……播放机(希望)最终会命中另一个活动的服务器

无论如何,启动Wireshark或其他数据包嗅探器的副本。点击音频播放器中的一个URL,检查流量。我们将首先查看请求和响应

GET /secretagent-128-aac HTTP/1.1
Host: ice1.somafm.com
User-Agent: VLC/2.2.4 LibVLC/2.2.4
Range: bytes=0-
Connection: close
Icy-MetaData: 1

HTTP/1.0 200 OK
Content-Type: audio/aacp
Date: Sat, 20 May 2017 20:43:56 GMT
icy-br:128
icy-genre:Various
icy-name:Secret Agent from SomaFM [SomaFM]
icy-notice1:<BR>This stream requires <a href="http://www.winamp.com/">Winamp</a><BR>
icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.5<BR>
icy-pub:0
icy-url:http://SomaFM.com
Server: Icecast 2.4.0-kh3
Cache-Control: no-cache, no-store
Pragma: no-cache
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Origin, Accept, X-Requested-With, Content-Type
Access-Control-Allow-Methods: GET, OPTIONS, HEAD
Connection: Close
Expires: Mon, 26 Jul 1997 05:00:00 GMT
icy-metaint:45000
Icy MetaData
头要求服务器将元数据与音频流数据进行多路复用。也就是说,“正在播放”曲目信息将定期发送并注入流中

在服务器响应头中,还有另一个密钥头:

icy-metaint:45000
这告诉我们两件事…第一件是服务器同意发送元数据。第二件是元数据间隔为45000字节。每45000字节,服务器将注入一块元数据。让我们回到数据包嗅探器,看看这是什么样子:

元数据块的第一个字节,
0x06
,告诉我们元数据块的长度。取该字节的值,乘以16,就可以得到元数据块的长度(以字节为单位)。也就是说,第一个元数据块字节的
0x06
告诉我们接下来的96个字节将是元数据,然后再返回到reg注意,这意味着整个元数据是97字节…长度指示符是1字节,其余的是96字节(在本例中)

现在,让我们进入实际的文本元数据格式:

StreamTitle='Buscemi - First Flight To London';StreamUrl='http://SomaFM.com/secretagent/';
它看起来非常简单。
key='value'
,分号
分隔。但是,这有一些大的缺陷。例如,没有真正标准的方法来转义单引号。如果元数据值需要包含单引号,有时是
\
,有时是
'
。有时它根本就逃不掉

此外,并非所有服务器都使用相同的字符编码。您可能可以安全地假设UTF-8,但确实可以预期某些服务器可能不同,或者只是在其自己的元数据编码中被破坏


无论如何,现在您已经知道了所有这些是如何工作的,您可以实现了。如果您愿意,我有一些代码可以授权。一个是Node.js API服务器,当给定一个流URL时,它将为您返回元数据,执行服务器端的所有缓冲和解析。另一个是基于MSE的客户端播放器……请注意,这只适用于th服务器支持CORS,据我所知,只有我自己的服务器(AudioPump CDN)如果你对这些代码感兴趣,请随时发电子邮件给我brad@audiopump.co.如果您对我在Stack Overflow上的回答有任何疑问,请在此处发表评论。

感谢您提供详细完整的回答!我将尝试在我的程序中使用它(我使用python)…Brad,感谢您的解释,我发现了以下内容:“深入的解释,但非常古老。它仍然有效吗?
Icy-MetaData: 1
icy-metaint:45000
StreamTitle='Buscemi - First Flight To London';StreamUrl='http://SomaFM.com/secretagent/';