Я не мог найти лучшего ответа на этот вопрос в Интернете, даже документ Liquidsoap не помог. Я хочу получить название текущей песни и исполнителя на моем потоковом сервере (icecast). На каком-то форуме я обнаружил, что им это удалось, но они не объяснили, как, вот сценарий liquidsoap, который они использовали:
def apply_metadata(m) =
title = m["title"]
artist = m["artist"]
album = m["album"]
[("artist","#{artist}"),("title","#{album} - #{title}")]
end
centovacast.callback_autodj := fun(s) -> map_metadata(apply_metadata,s)
Этот скрипт, я верю, также предназначен только для centova и autodj. Хотя я не использую эти технологии (я использую Ubuntu 16.04, Icecast2, Liquisoap, PHP, HTML5 / CSS),
это можно сделать с помощью инструментов, которые я сейчас использую?
Я не уверен, почему вы перетаскиваете исходный клиент в это.
Надлежащий поток, отправляемый в точку монтирования Icecast, будет содержать метаданные для воспроизведения звука в данный момент.
Это было указано в другом месте. Icecast начиная с 2.4.1 обеспечивает правильный экспорт метаданных JSON.
Запрос JSON изнутри веб-сайта — это в значительной степени решенная проблема, и он считается упражнением для склонного читателя.
Почему бы тебе не взять это на ледяной трансляции напрямую?
PHP:
function get_icecast_info($server_ip, $server_port, $admin_user, $admin_password) {
$index = @file_get_contents("http://".$admin_user.":".$admin_password."@".$server_ip.":".$server_port."/admin/stats.xml");
if($index) {
$xml = new DOMDocument(); if(!$xml->loadXML($index)) return false; $arr = array(); $listItem = $xml->getElementsByTagName("source");
foreach($listItem as $element) {
if($element->childNodes->length) {
foreach($element->childNodes as $i){ $arr[$element->getAttribute("mount")][$i->nodeName] = $i->nodeValue; }
}
}
return $arr;
} return false;
}
И это вывод (массив):
$arr = get_icecast_info($ice_host, $ice_aport, $ice_user, $ice_pass);
Раньше я использовал веб-сокеты для получения метаданных, но меня расстраивало, что они всегда были не синхронизированы.
Единственный способ решить эту проблему — закодировать метаданные в поток, чтобы вы получали их одновременно с аудио.
Я немного покопался, чтобы выяснить, как это делают серверы icecast, и составил сценарий сервисного работника, который добавляет необходимый заголовок к вашему запросу для получения потока, включающего метаданные, а затем извлекает его для вас.