Танці з бубном →  Трансляція звуку в мережу, або домашнє радіо

Привіт, сьогодні я розповім про те, як влаштовував у себе бедротову трансляцію звуку.
Наперед скажу, що рецепт далекий від оптимальності, але, він був продиктований умовами і на моє щастя, він працює:)

Передумови:
Маємо headless unix-сервер, який попутньо є Wi-Fi-роутером, і під’єднаний до акустичної системи. На ньому крутиться mpd, з опціональним керуванням через веб-інтерфейс.
Також маємо лаптоп на якому є більшість музики, яку ми любимо, і Amarok — єдиний плеєр, який визнаємо.

У мене давно було бажання реалізувати схему трансляції звуку, але декілька спроб завершилися нічим. Зокрема спроба передавати звук pulse-audio через мережу. (не вийшло, через дуже фігову роботу останнього під freebsd, та мою релігійну нелюбов до нього).
Отож, почнемо.

Для мережевої трансляції використаємо IceCast (аналог Shoutcast).
Ставимо його на наш лаптоп (дистрибутив — Arch Linux)
yaourt -S icecast
В інших дистрах — аналогічно, згідно менеджера пакетів.

Налаштовуємо конфіг файл(XML):

<icecast>
<limits>
<clients>100</clients>
<sources>2</sources>
<threadpool>5</threadpool>
<queue-size>131072</queue-size>
<client-timeout>15</client-timeout>
<header-timeout>5</header-timeout>
<source-timeout>2</source-timeout>
<burst-on-connect>0</burst-on-connect>
<burst-size>4096</burst-size>
</limits>

<authentication>
<source-password>hackmeplenty</source-password>
<relay-password>hackmeplenty</relay-password>
<admin-user>admin</admin-user>
<admin-password>hackmeplenty</admin-password>
</authentication>
<hostname>meakowifi.vluchna</hostname>
<listen-socket>
<port>8001</port>
<bind-address>0.0.0.0</bind-address>
<shoutcast-mount>/stream</shoutcast-mount>
</listen-socket>

<fileserve>1</fileserve>

<paths>
<basedir>/usr/share/icecast</basedir>
<logdir>/home/meako/.icecast/logs</logdir>
<webroot>/usr/share/icecast/web</webroot>
<adminroot>/usr/share/icecast/admin</adminroot>
<alias source="/" dest="/status.xsl"/>
</paths>

<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<loglevel>3</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
<logsize>10000</logsize> <!-- Max size of a logfile -->
</logging>

<security>
<chroot>0</chroot>
</security>
</icecast>


Загалом по конфігурації нескладно орієнтуватися згідно коментів (паролі я поміняв, ага:)) ). Для себе я ж налаштовував по можливості на найменшу часову затримку. Оскільки канал Wi-Fi відносно товстий в порівнянні з типовими інтернет-каналами.

Далі запускаємо сервіс icecast
icecast -b -c ~/.icecast/icecast.xml
Перевірити та поадмінити його можна за адресою

http://127.0.0.1:8001/ чи будь-якою, яку ви налаштували в конфігу.

Наступний крок, потрібно щось в цей icecast передавати.
Для цього використовуються icecast-клієнти.
Мені було потрібно передавати той звук, що йде на аудіовихід alsa.
Спершу я спробував клієнт ices. З ним вийшло усе, що можна витягнути з моєї конфігурації (про цей нюанс пізніше). Але в порівнянні з клієнтом darkice він повільніший і створює більші затримки в трансляції.
Тож приведу конфігурацію клієнта darkice (поставити з улюбленого репо вміємо, правда?:) ).
[general]
duration        = 0         # duration of encoding, in seconds. 0 means forever
bufferSecs      = 5         # size of internal slip buffer, in seconds
reconnect       = yes       # reconnect to the server(s) if disconnected
realtime        = no
# this section describes the audio input that will be streamed
[input]
device          = default  # OSS DSP soundcard device for the audio input
sampleRate      = 44100     # sample rate in Hz. try 11025, 22050 or 44100
bitsPerSample   = 16        # bits per sample. try 16
channel         = 2        # channels. 1 = mono, 2 = stereo

[icecast2-0]
format          = vorbis
bitrateMode     = vbr
quality         = 0.9

server          = localhost
mountPoint      = meakowifi
port            = 8001
password        = hackmeplenty
name            = meako
description     = localradio
url             = meakowifi.vluchna
genre           = Radio
public          = yes
Як бачимо, конфіг простий і зрозумілий. На ньому не зупинятимуся.

Налаштування mpd також нескладне діло, та якщо спільнота побажає, якось розповім про налаштування headless mpd+relaxx(web ui)

Тепер про проблеми. Найбільшою і найменш очікуваною для мене проблемою виявилась неможливість захоплення звуку з аудіовиходів alsa.
На її вирішення я вбив біля двох днів, облазив усі форуми і все що тільки можна, спробував Jack-аудіо, різні icecast-клієнти, і костилі. Й не придумав нічого ліпше за апаратне вирішення проблеми: кабель хлопчик-хлопчик заводиться з аудіовиходу ноутбука на його ж line-in.
Ця проблема пов’язана лише з моєю звуковою картою Intel Corporation 82801H (ICH8 Family) HD Audio Controller (rev 02) і в решти виникнути не повинна.

Отож, створюємо в ~/.bashrc alias для зручного запуску транслятора:
alias icemusic="icecast -b -c ~/.icecast/icecast.xml && screen -d -m darkice -c ~/.ices/darkice.cfg"
Запускаємо.

На сервері, через веб-інтерфейс вказуємо слухати наш аудіо-потік.
скріншот буде, коли підніметься Picamatic.com
Вмикаємо музику і насолоджуємося.

Після-слово.
Така конфігурація, як я вже казав, далека від оптимальності. Наприклад стискання звуку на льоту створює постійне навантаження на процесор (5-8%) та на мережу. Також затримка, приблизно у 1-2 секунди, задовільна для прослуховування музики, але аж ніяк не підходить для відео.

Тож з задоволенням послухаю ваші пропозиції та зауваження:)

коментарі:

Enetri 04.05.2010 12:07
Можна пропозицію в якості офтопіку? Блог Танці з бубном? Як для справжніх лінуксоїдів :) Тим більше, що не такі вони й складні, ті танці — особливо, якщо є хороша супровідна інструкція.

Пародіювати Хабр, звичайно, ніхто не боронить, але… Місце/нагода для колективної творчості знайдеться завжди.
smaxys 04.05.2010 12:22
Картинка недоступна
А так приїду в хостел будем провіряти радіво

додати коментар: