Raspberry + Liquidsoap + Icecast

Здесь будет туториал Liquidsoap на одноплатнике.

Использовалась связка Raspberry Pi 3 B+ вместе с Raspbian Stretch Lite 4.14, Liquidsoap 1.3.3, Icecast 2.4.4 (туториал по установке последнего здесь).

Raspbian

https://www.raspberrypi.org/downloads/

Есть три варианта:

  • Записываем на флешку NOOBS и запускаем Raspberry Pi - на старте выберем, например, самый простой Raspbian Stretch Lite (без десктопа будет достаточно, но при желании и достаточном месте на microSD можно выбрать и десктоп версию)
  • С помощью Etcher или любого другого софта записывается .img образ Raspbian
  • .img образ записывается на флешку с помощью командной строки (вариант для любителей)

Начинаем с чистого образа Raspbian/Jessie. После установки ОС:

sudo raspi-config

По желанию можно настроить следующее:

  • Change User Password
  • Advanced Options - Expand Filesystem.
  • Advanced Options - Hostname (по желанию для безопасности можно изменить hostname)
  • Interfacing Options - SSH - Enable (для связи через SSH, опционально)
  • Finish - Reboot - Yes
**sudo apt-get update**
**sudo apt-get upgrade**
Liquidsoap

Liquidsoap - многофункциональный, мощный инструмент для создания программируемых аудиотрансляций.

В отличие от привычных программ (вроде SAM Broadcaster, Mixxx, Nicecast, butt (broadcast using this tool), liquidsoap - это скорее язык программирования трансляции медиа. Но в этом его простота: в рабочей директории есть папка с аудиофайлами и один скрипт, в котором мы настраиваем свою радиостанцию.

Он до сих пор поддерживается разработчиками, но его установка вызвала у меня кучу проблем, так как он зависит от множества дополнительных пакетов, и обычный apt-get install тут уже не работает (таким образом можно установить liquidsoap, но это будет старая версия, которая не поддерживается разработчиками), актуальный пакет грузиться с помощью менеджера пакетов opam.

sudo apt-get install opam

Теперь нужно установить несколько пакетов, с которыми работает opam

sudo apt-get install camlp4-extra
sudo apt-get install libpcre-ocaml-dev
sudo apt-get install libmad-ocaml-dev
sudo apt-get install m4
sudo apt-get install m4-doc
sudo apt-get install opam camlp4-extra libpcre-ocaml-dev libmad-ocaml-dev m4 m4-doc

Из-за особенностей работы opam (он устанавливает всё в папку home того пользователя, который устанавливал пакеты - это хороший и безопасный способ, но мешает нормальной работе, скажем, если нужно сделать что-то под другим пользователем) прибегаем к необходимости создания специального пользователя для работы с liquidsoap:

sudo adduser liquidsoap audio

The audio group allows access the the audio hardware. Группа даёт доступ к настройкам аудио. Технически необязательно если Вы собираетесь лишь транслировать аудио, но лишним не будет.

Теперь переключаемся на этого пользователя:

su liquidsoap

Переходим в корректную домашнюю директорию:

cd ~

Базовая настройка opam:

opam init

Отвечаем y чтобы обновить bashrc.

Выходим, чтобы зайти обратно и закончить настройку opam:

exit

Заходим в пользователя liquidsoap:

su liquidsoap

Проверяем, что все пакеты актуальны:

opam update

Запрашиваем список всех пактов, которые необходимы для работы liquidsoap:

opam install depext

opam depext taglib mad lame vorbis cry pulseaudio liquidsoap - необходимые пакеты. Вам предложат команду apt-get, отвечаем noђ, так как пользователь liquidsoap не может делатьsudo`.

Переключаемся с пользователя liquidsoap обратно на pi и устанавливаем необходимые пакеты:

exit
  • libasound2-dev - for ALSA.
  • libmp3lame-ocaml-dev - for mp3 encoding
  • libtaglib-ocaml-dev - for mp3id3 metadata access
  • libalsa-ocaml-dev - for ALSA soundcard i/o
  • libpulse-ocaml-dev - for Pulseaudio i/o
  • libmad-ocaml-dev - for mp3 decoding
  • libcry-ocaml-dev - for shoutcast/icecast output
  • libvorbis-ocaml-dev - for ogg/vorbis output
  • libogg-ocaml-dev - for ogg/vorbis output
sudo apt-get install libasound2-dev libmp3lame-ocaml-dev libtaglib-ocaml-dev libalsa-ocaml-dev libpulse-ocaml-dev libmad-ocaml-dev libcry-ocaml-dev libvorbis-ocaml-dev libogg-ocaml-dev

Переключаемся обратно на liquidsoap и устанавливаем необходимые пакеты:

su libquidsoap
opam install taglib mad lame vorbis cry samplerate liquidsoap

opam info liquidsoap выдаст информацию о пакетах, которые можно подключить дополнительно.

У меня что-то не работало:

bash: liquidsoap: command not found

При этом информация выдавалась, что пакет установлен:

liquidsoap@raspberrypi:/home/pi $ opam info liquidsoap
             package: liquidsoap
             version: 1.3.3-1
          repository: default
        upstream-url: https://github.com/savonet/liquidsoap/releases/download/1.3.3/liquidsoap-1.3.3.tar.bz2
       upstream-kind: http
   upstream-checksum: a0283885f3c41753a4ce29b4d69ce2e9
            homepage: https://github.com/savonet/liquidsoap
         bug-reports: https://github.com/savonet/liquidsoap/issues
            dev-repo: https://github.com/savonet/liquidsoap.git
              author: The Savonet Team <savonet-users@lists.sourceforge.net>
             depends: camomile >= 1.0.0 & dtools >= 0.3.4 & duppy >= 0.6.0 & mm >= 0.2.1 & ocamlfind & pcre
             depopts: alsa | ao | bjack | cry | dssi | faad | fdkaac | ffmpeg | flac | frei0r | gavl | inotify | ladspa | lame | lastfm | lo | mad | magic | ogg | opus | osx-secure-transport | portaudio | pulseaudio | samplerate | shine | soundtouch | speex | ssl | taglib | theora | vorbis | xmlplaylist | yojson
   installed-version: 1.3.3-1 [system]
  available-versions: 1.2.0, 1.2.1, 1.3.0, 1.3.1, 1.3.2, 1.3.3, 1.3.3-1, 1.3.4
         description: Swiss-army knife for multimedia streaming
Liquidsoap is a powerful and flexible language for describing your
streams. It offers a rich collection of operators that you can combine
at will, giving you more power than you need for creating or
transforming streams. But liquidsoap is still very light and easy to
use, in the Unix tradition of simple strong components working
together.
Решение:
eval $(opam config env)

Edit: Если не помогло удалите директорию /home/liquidsoap/.opam/4.00.1и попробуйте снова

Лог:

Из radio.liq строчка с выбором директории для .log файла ставится под комментарий, используется стандартное значение. Если выдаётся ошибка, что директории под неё не существует:

FATAL ERROR: Log directory "/home/liquidsoap/.opam/system/lib/liquidsoap/var/log/liquidsoap" does not exist.

To change it, add the following to your script:

set("log.file.path", "")

Создаём директорию для log:

mkdir -p /home/liquidsoap/.opam/system/lib/liquidsoap/var/log/liquidsoap

Через 3 недели работающего скрипта набирается файл размером 20 Мб, поэтому периодически я его подчищал:

Делаем бэкап:

cp radio.log radiobackup.log

Разрешаем себе скачивать файл с помощью удобного клиента:

chmod -R 755 /home/liquidsoap/.opam/system/lib/liquidsoap/var/log/liquidsoap/radio.log

Удаляем файл (при повторном запуске скрипта лог начнется с начала):

rm ****/home/liquidsoap/.opam/system/lib/liquidsoap/var/log/liquidsoap/radio.log
Liquidsoap установлен!

Теперь осталось настроить поток:

sudo ln -s /home/liquidsoap/.opam/system/bin/liquidsoap/ usr / bin / liquidsoap
sudo mkdir / etc / liquidsoap $ sudo nano /etc/liquidsoap/radio.liq

Ниже пример моего файла конфигурации radio.liq, который находится в той же директории, что и папки music и jingles, откуда liquidsoap будет брать файлы. При желании можно добавить, например, папки night, day и evening, и в настройках switch выбрать время, в которое будет играть определённая музыка.

# Run this script in the same directory: $ liquidsoap radio.liq &
#!/usr/bin/liquidsoap
# Log dir
set(“log.file.path”, “/home/liquidsoap/liquidsoap.log”)

# Playlists
music = playlist.safe(reload=3600, “music”)
jingles = playlist.safe(reload=3600, “jingles”)

# Time-based playlist schedule. Time zone is EDT (UTC-4)
scheduler = switch([
  ({ 00h-23h59 }, music)
  # ({ 00h-09h59 }, night),
  # ({ 10h-17h59 }, day),
  # ({ 18h-23h59 }, evening) 
])

# I didn’t want jingles to crossfade so it only applies to the music
scheduler = crossfade(start_next=4., fade_out=2., fade_in=3., scheduler)
# In case of emergency, fall back to a placeholder-like audio file that will play if anything goes wrong
scheduler = fallback([scheduler, single(“jingles/VLR Radio - Jingle 7.mp3”)])

# Play ~1 jingle per ~3 music tracks. For exactly 1 jingle per 3 tracks use “rotate” instead of “random”
radio = random(weights = [1, 3], [jingles, scheduler])
radio = mksafe(radio)

# Icecast configuration & output
output.icecast(
  %mp3(bitrate=128, samplerate=44100, stereo=true),
  host = “192.168.0.1″, 
  port = 8000,
  password = “password”,
  mount = “listen.mp3″,
  name = “Radio name”, 
  description=“Radio description.“,
  genre = “Radio genre”,
  url = “https://viktorgordienko.com”,
  encoding = “UTF-8”,
  # encoding = “Windows-1252″,
  radio
)   

Запуск трансляции:

su liquidsoap
liquidsoap radio.liq &

Добавляем & чтобы можно было закрыть терминал и идти пить чай.

По какой-то причине (сам ещё не разобрался), каждый раз при вхождении в юзера liquidsoap команда liquidsoap не находится, это решается всё тем же

eval $(opam config env)

Моя радиостанция находится здесь:


Полезные ссылки

Тут на французском, но информация оказалась полезной:


Deefuzzer

Liquidsoap - сложный и многофункциональный инструмент, но в случае, если такой широкий функционал не нужен, есть более простой в понимании и установке аналог - Deefuzzer. Ниже ссылки на полезную. информацию по нему:


Сравнение характеристик

Raspberry Pi 1 B+
Temp 37.9º C 38.5º C 39.0º C
CPU 47% - 100% 51.3% - 100% 79.6% - 100%
Raspberry Pi 3 B+
Temp 53.7º C 53.2º C 52.6º C
CPU 8.9% - 9.2% 8.7% - 8.9% 7.9% - 8.9%

March 6, 2019