Как извлечь потоковые "сейчас воспроизводимые" данные, встроенные в аудио (радио) поток Icecast на Samsung Smart-TV
Я создаю приложение Samsung TV для радиостанции, и они предоставляют информацию "Now Playing" в потоке Icecast. Можно ли (и как мне) извлечь эту информацию?
5 ответов
Shoutcast поддерживает "Icy-MetaData" - дополнительное поле в заголовке запроса. Когда установлено, это запрос к серверу shoutcast для встраивания метаданных о потоке с периодическими интервалами (один раз каждые байты "icy-metaint") в сам кодированный аудиопоток. Значение "icy-metaint" определяется конфигурацией сервера shoutcast и отправляется клиенту как часть первоначального ответа.
Прочтите этот пост в Shoutcast Internet Radio Protocol, чтобы узнать подробности о icy: метаданные и примеры кода на C.
Несколько более техническое обсуждение также доступно на
http://forums.radiotoolbox.com/viewtopic.php?t=74
От родного плеера нет возможности получить эту мету.
Возможно, вы могли бы использовать плагин jQuery.stream для непосредственного извлечения мета - но вам нужно настроить Access-Control-Allow-Origin на вашем сервере icecast - но я понятия не имею, будет ли он работать.
Лучшее решение здесь будет использовать этот скрипт: http://code.google.com/p/icecast-now-playing-script/
Таким образом, вы устанавливаете этот сценарий на своем веб-сервере, и из приложения SmartTV вы будете AJAX один раз на время воспроизведения потока.
Если вы делаете это для радиостанции, то они могут предоставить эти данные с помощью функции XSLT Icecast. Несколько случайных старых примеров XSLT для предоставления потоковых метаданных, которые я сделал в какой-то момент.
Другой вариант - запустить Icecast 2.4.1 или добавить два файла (xml2json.xsl status-json.xsl) в старую версию.
Обратите внимание, что только Icecast 2.4.1 или новее поддерживает добавление заголовков CORS/ACAO, которые могут понадобиться для доступа к данным из веб-приложения / веб-сайта.
Если вы не сотрудничаете напрямую с радиостанцией и не можете попросить их сделать это, игнорируйте этот ответ. Кто-то еще может найти это полезным, хотя.
Да, это возможно. Метаданные чередуются в данные потока с заданным интервалом. По сути, вы читаете 8192 байта (или все, что указано в Icy-MetaInt
заголовок ответа), а затем вы читаете блок метаданных.
Первый байт этого блока метаданных сообщает вам длину данных. Длина 0 означает, что обновленные метаданные отсутствуют.
Как только вы прочитаете метаблок, вы вернетесь к чтению потоковых данных.
У меня есть все это более подробно в моем ответе здесь: /questions/25363115/poluchenie-informatsii-o-dorozhke-iz-audiopotoka-s-pomoschyu-php/25363132#25363132 Хотя я знаю, что вы не пишете PHP, принципал идентичен независимо от того, на каком языке.
Я только что создал радио плеер для Icecast и Centova, он использует API LastFM для извлечения метаданных песни. https://github.com/johndavedecano/Icecast-Centova-LastFM-API