Lev*_*ith 19 php audio-streaming
是否可以使用PHP从音频流中提取音轨信息?我已经做了一些挖掘,我能找到的最接近的函数是stream_get_transports,但我的主机不支持通过fsockopen()的http传输,所以我将不得不做一些修补,看看该函数返回的是什么.
目前,我正在尝试从AOL流中提取艺术家和跟踪元数据.
Bra*_*rad 50
这是一个SHOUTcast流,是的,它是可能的.它与ID3标签完全无关.我前一段时间写了一个脚本来做这个,但是找不到它了.就在上周,我帮助了另一个拥有相当完整脚本的人来做同样的事情,但是我不能只是把它发布到它,因为它不是我的.如果您发送电子邮件至brad@musatcha.com,我会通过电子邮件与您联系.
无论如何,这是如何自己做的:
您需要做的第一件事是直接连接到服务器.不要使用HTTP.好吧,你可以使用cURL,但它可能比它的价值更麻烦.您使用fsockopen()
(doc)连接到它.确保使用正确的端口.另请注意,许多Web主机将阻塞大量端口,但您通常可以使用端口80.幸运的是,所有AOL托管的SHOUTcast流都使用端口80.
现在,就像你的客户那样提出你的要求.
GET /whatever HTTP/1.0
但是,在发送之前<CrLf><CrLf>
,请包含下一个标题!
Icy-MetaData:1
这告诉服务器你想要元数据.现在,发送你的一对<CrLf>
.
好的,服务器将响应一堆标题,然后开始向您发送数据.在那些标题中将是icy-metaint:8192
或类似的.那个8192是元间隔.这很重要,而且确实是您需要的唯一价值.它通常是8192,但并不总是如此,所以一定要实际读取这个值!
基本上它意味着,你将获得8192个字节的MP3数据,然后是一大块元数据,接着是8192个字节的MP3数据,接着是一大块元数据.
读取8192个字节的数据(确保不包括此计数中的标头),丢弃它们,然后读取下一个字节.该字节是元数据的第一个字节,表示元数据的长度.获取此字节的值(带有ord()
(doc)的实际字节),并将其乘以16.结果是元数据要读取的字节数.将这些字节数读入字符串变量供您使用.
接下来,修剪此变量的值.为什么?因为字符串0x0
在末尾填充(以使其均匀地适合16个字节的倍数),并且trim()
(doc)为我们处理.
你会留下这样的东西:
StreamTitle='Awesome Trance Mix - DI.fm';StreamUrl=''
我会让你选择解析它的方法.就个人而言,我可能只是以2的限制分开;
,但要注意包含的标题;
.我不确定转义字符方法是什么.一些实验应该可以帮到你.
完成后不要忘记断开与服务器的连接!
那里有很多SHOUTcast MetaData引用.这是一个很好的:http: //www.smackfu.com/stuff/programming/shoutcast.html
Fra*_*ula 14
看看这个:https://gist.github.com/fracasula/5781710
这是一个PHP功能,让您从流媒体URL中提取MP3元数据(StreamTitle).
通常,流服务器icy-metaint
在响应中放置一个标题,告诉我们在流中发送元数据的频率.该函数检查该响应头,如果存在,它将用它替换interval参数.
否则,该函数调用关于您的间隔的流式URL,如果没有任何元数据,则它将再次尝试从offset参数开始的递归.
<?php
/**
* Please be aware. This gist requires at least PHP 5.4 to run correctly.
* Otherwise consider downgrading the $opts array code to the classic "array" syntax.
*/
function getMp3StreamTitle($streamingUrl, $interval, $offset = 0, $headers = true)
{
$needle = 'StreamTitle=';
$ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36';
$opts = [
'http' => [
'method' => 'GET',
'header' => 'Icy-MetaData: 1',
'user_agent' => $ua
]
];
if (($headers = get_headers($streamingUrl))) {
foreach ($headers as $h) {
if (strpos(strtolower($h), 'icy-metaint') !== false && ($interval = explode(':', $h)[1])) {
break;
}
}
}
$context = stream_context_create($opts);
if ($stream = fopen($streamingUrl, 'r', false, $context)) {
$buffer = stream_get_contents($stream, $interval, $offset);
fclose($stream);
if (strpos($buffer, $needle) !== false) {
$title = explode($needle, $buffer)[1];
return substr($title, 1, strpos($title, ';') - 2);
} else {
return getMp3StreamTitle($streamingUrl, $interval, $offset + $interval, false);
}
} else {
throw new Exception("Unable to open stream [{$streamingUrl}]");
}
}
var_dump(getMp3StreamTitle('http://str30.creacast.com/r101_thema6', 19200));
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助!