问题描述
您需要做的第一件事是直接连接到服务器。不要使用HTTP。好吧,您可能会使用cURL,但是它可能比它的价值更麻烦。您使用fsockopen()
doc连接到它。确保使用正确的端口。还要注意,许多Web主机将阻止很多端口,但是通常可以使用端口80。幸运的是,所有AOL托管的SHOUTcast流都使用端口80。
现在,就像您的客户一样提出您的请求。
GET /whatever HTTP/1.0
但是,在发送之前<CrLf><CrLf>
,请包含下一个标头!
Icy-MetaData:1
这告诉服务器您需要元数据。现在,发送一对<CrLf>
。
好的,服务器将用一堆头响应,然后开始向您发送数据。在这些标题中,将为icy-Metaint:8192
或相似。那8192是 Meta区间
。这很重要,实际上是您唯一需要的价值。通常为8192,但并非总是如此,因此请确保实际读取此值!
基本上,这意味着您将获得8192字节的MP3数据,然后是一块Meta,然后是8192字节的MP3数据,然后是一块Meta。
读取8192字节的数据(确保在此计数中不包括标题),将其丢弃,然后读取下一个字节。该字节是元数据的第一个字节,并指示元数据有多长时间。取该字节的值(带ord()
(doc的实际字节),然后乘以16。结果是要读取的元数据字节数。将这些字节数读入字符串变量中以供使用。
接下来,修剪此变量的值。为什么?因为该字符串0x0
的末尾被填充(以使其均匀地适合16字节的倍数),并且trim()
doc为我们处理了该问题。
您将看到类似以下的内容:
StreamTitle='Awesome Trance Mix - DI.fm';StreamUrl=''
我将让您选择解析方法的选择方法。就我个人而言,我可能只拆分了2个;
,但要提防包含的标题;
。我不确定转义字符方法是什么。进行一些实验可以为您提供帮助。
使用完服务器后,请不要忘记断开与服务器的连接!
解决方法
是否可以使用PHP从音频流中提取轨道信息?我已经进行了一些挖掘,可以找到的最接近的函数是stream_get_transports,但是我的主机不支持通过fsockopen()进行http传输,因此,我将不得不做更多的工作来看看该函数还会返回什么。
目前,我正在尝试从AOL流中提取艺术家并跟踪元数据。