Как извлечь информацию «текущая дорожка / сейчас воспроизводится» из радиопотока Shoutcast/Icecast? Я пробовал следующие решения:
- https://github.com/ghaiklor/icecast-parser
- https://code.google.com/archive/p/streamscraper/
- Анализ файла .xspf Невозможно извлечь метаданные из некоторых потоков icecast
- Анализ аудиопотока в PHP/родном Android (получить информацию с потокового радио, Извлечение информации о дорожке из аудиопотока с использованием PHP, http://www.smackfu.com/stuff/programming/shoutcast.html< /а>
Все описанные выше методы работают для некоторых радиостанций, таких как http://icecast.vrtcdn.be/stubru-high.mp3
Однако для ряда потоков icecast/shoutcast все они терпят неудачу. Пример: http://icecast-qmusic.cdp.triple-it.nl/Qmusic_be_live_64.aac. При анализе самого аудиопотока streamTitle всегда пуст. Файл xspf всегда имеет пустой тег заголовка. Однако я заметил, что другие приложения и веб-сайты успешно собирают информацию о текущей дорожке для этой радиостанции. На главной странице радиостанции также содержится информация о текущем треке/плейлисте: https://qmusic.be/playlist/qmusic а>.
Я знаю, что мог бы пойти и написать парсер html, который извлекает эти данные, но я хочу использовать его только в крайнем случае. Кроме того, у меня есть несколько потоков с похожими проблемами, и это не будет общим решением, которое можно применить ко всем из них.
Итак, я что-то упустил? Есть ли другой общий способ извлечения метаданных с сервера icecast/shoutcast? Я также пытался использовать файл 7.html или файлы /stats?sid=1, но мне не очень повезло с этими подходами (например: файлы отсутствуют/неверные URL-адреса). Ниже php-скрипт одной из гиперссылок, которая работает в некоторых случаях. Любая помощь или отзывы будут очень признательны!
PS: извините за путаницу инструментов/фреймворков/языков. Перепробовал здесь много всего. Отдельное спасибо за ответы, совместимые с React-Native!
<?php
function getMp3StreamTitle($streamingUrl, $interval, $offset = 0, $headers = true)
{
$needle = 'StreamTitle=';
$ua = 'Mozilla';
$opts = [
'http' => [
'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://icecast.vrtcdn.be/stubru-high.mp3', 16000));
http://icecast-qmusic.cdp.triple-it.nl/Qmusic_be_live_64.aac
могут показывать данные о трансляции? Я слушаю его сейчас и не вижу никаких метаданных в этом потоке. - person Brad   schedule 19.03.2019Mozilla
. Это нарушит совместимость со старыми версиями SHOUTcast. Ваша строка пользовательского агента должна не содержатьMozilla
для серверов SHOUTcast v1. Кроме того, URL-адрес должен иметь точку с запятой;
для этих серверов. (Но не используйте этот хак без необходимости! Он не совместим с большинством других серверов.) - person Brad   schedule 19.03.2019