Поставили как-то раз передомной задачу — установить в локальной сети медиа сервер, на условии, что он будет принимать радио со спутника и вещать его в локальную сеть.
Все бы ничего, т.к. можно поднять это и на стандартном виндовсе, но не в моем случае т.к. я уже заядлый юниксоид и программы, написанные для виндовс работают только с одной картой, а у меня их стояло аж 3.
Хотел сначала поднять на FreeBSD, но узнав, что драйвер для фрихи не существует в природе (который бы работал не только с интернет, но и с мультимедией) — пришлось искать альтернативные решения.
И так железо:
- DVB-карты TechniSat SkyStar2 rev. 2.8a — 2 штуки
- TechnoTrend S-1401
ПО сервера:
- Linux Ubuntu — Server 9.04
- linux-source
- linux-headers
- linux-image
- libncurses5
- make
- dvb-apps
- разрабатываемые драйвера и программу getstream с сайта linuxtv.org
ПО-клиента:
- ОС *nix/windows/MacOS
- проигрыватель vlc или любой другой поддерживающий воспроизведение TS-потока
Я расскажу как настроить 3 dvb-карты на прием каналов с 3х спутников и вещать эти каналы в локальную сеть. Описание будет очень подробным.
Теперь по порядку.
1. Устанавливаем Ubuntu 9.04 (я взял в серверной версии т.к. все равно ничего кроме радио на нем работать не будет, да и работать за ним я не особо собираюсь).
Процесс установки я описывать не буду. По окончании установки устанавливаем программы:
- linux-source
- linux-headers
- linux-image
- libncurses5
- make
это основные пакеты, без которых драйвера не установятся.
2. Скачиваем разрабатываемые драйвера с linuxtv.org, распаковываем, далее выполняем:
- make all
- make install
процесс долгий, т.к. будут пересобираться все драйвера, для всех карт. По окончании установки драйверов необходимо перезагрузиться.
3. Перезагрузившись проверяем встали ли сами драйвера. Выполняем:
ls /dev/dvb
Если появился список устройств то все хорошо. Если нет, то подкружаем модули ядра.
#depmod -a
затем
#modprobe <имя-модуля>
в нашем случае:
#modprobe b2c2
#modprobe SkyStar2
4. Теперь устанавливаем пакеты dvb-apps и getstream:
sudo apt install get dvb-apps getstream
5. Далее выполним 2 команды, что позволит нам дать доступ к /dev/dvb:
$sudo gpasswd -a audio
$sudo gpasswd -a video
Это если вы не хотите чтобы у вас радио запускалось от рута, а если вас не пугает нарушение идеологии Убунту, то можно и не выполнять это.
6. Создаем файл конфигурации (в любом удобном вам месте) для scan (приложение входит в состав dvb-apps), в котором указываем частоту, поляризацию, символьную скорость и FEC:
S 11671000 H 18200000 5/6
S — является произвольной буквой. Устанавливать её обязательно.
7. Запускаем скрипт с целью проверки параметров настройки:
$ scan -a 0 90
Если все правильно прописано, то должен появиться список программ/сервисов, находящихся на транспондере.
scanning 90
using ‘/dev/dvb/adapter0/frontend0’ and ‘/dev/dvb/adapter0/demux0’
initial transponder 11671000 H 18200000 5
>>> tune to: 11671:h:0:18200
DVB-S IF freq is 1921000
Network Name ‘RuSat Satellite Network’
0x0000 0x0834: pmt_pid 0x0000 SNT — Silver Rain (running)
0x0000 0x0835: pmt_pid 0x0000 SNT — Nashe radio (running)
0x0000 0x0837: pmt_pid 0x0000 SNT — Radio Teos (running)
0x0000 0x0b54: pmt_pid 0x0000 Scopus — SevenSkies (running)
dumping lists (4 services)
Silver Rain:11671:h:0:18200:0:2102:2100
Nashe radio:11671:h:0:18200:0:2104:2101
Radio Teos:11671:h:0:18200:0:2108:2103
SevenSkies:11671:h:0:18200:0:2902:2900
Done.
8. Теперь приступаем к настройке getstream. Данная программа может вещать как по tсp , так и по udp.
Я настраивал для http (8080/tcp). Средняя загруженность канала для одного принимающего ~270 кбит/с.
Настройка довольно гибкая тем, что имея 2 и более dvb-карт их все можно описать в одном файле конфигурации.
Если есть каналы, которые вы не хотели бы вещать по тем или иным причинам, то можно не указывать pid (Packet ID — идентификационный номер пакета на спутнике, пакетом является набор программ находящихся на одной частоте, символьной скорости, поляризации и FEC одновременно) канала в файле конфигурации.
Вот общий шаблон файла конфигурации для getstream:
указываем порт, на который будет происходить вещание:
http{
port ****;
};
перечисляем настройки карты на спутник и прием:
adapter N {
};
перечисляем параметры потока, который будет вещаться в сеть, описываем входные данные и исходящий адрес url.
stream {
};
На этом собственно все.
Пример конфига на прием каналов с одного транспондера:
http{
port 8080;
};
adapter 0 {
packet-buffer 50;
stat-interval 120;
dvb-s {
lnb {
lof1 9750000; #Нижний предел
lof2 10600000; #Верхний предел
slof 11700000; #Частота переключения
};
transponder { #описываем транспондер
frequency 11671000; #Частота приема
polarisation v; #поляризация
symbol-rate 18200000; #символьная скорость
};
};
#начало описания потока
stream {
name "Serebryany Dozhd"; #имя потока
#входные данные потока
input {
pnr 2100; #pid пакета на спутнике
};
#выходные данные для потока
output-http {
url /serebryany_dozhd; #URL адрес, на который будет вещаение
};
};
#ниже идет описание оставшихся 3х каналов, вещаемых с этого транспондера.
stream {
name "Nashe Radio";
input {
pnr 2101;
};
output-http {
url /nashe_radio;
};
};
stream {
name "Radio Teos";
input {
pnr 2103;
};
output-http {
url /radio_teos;
};
};
stream {
name "Seven Skies";
input {
pnr 2900;
};
output-http {
url /seven_skies;
};
};
};
Вот конфиг на прием с 2х транспондеров:
http{
port 8080;
};
adapter 2 {
packet-buffer 50;
stat-interval 120;
dvb-s {
lnb {
lof1 9750000;
lof2 10600000;
slof 11700000;
};
transponder {
frequency 11050000;
polarisation v;
symbol-rate 3300000;
};
};
stream {
name "BuisnesFM";
input {
pnr 1;
};
output-http {
url /buisnesfm;
};
};
stream {
name "HumorFM";
input {
pnr 2;
};
output-http {
url /humorfm;
};
};
stream {
name "Pomestnoe radio";
input {
pnr 3;
};
output-http {
url /pomestnoe;
};
};
stream {
name "KinoFM";
input {
pnr 4;
};
output-http {
url /kinofm;
};
};
stream {
name "Record";
input {
pnr 5;
};
output-http {
url /record;
};
};
stream {
name "Miliceyskaya volna";
input {
pnr 6;
};
output-http {
url /miliceyskaya_volna;
};
};
##и т.д. по остальным каналам
};
adapter 0 {
packet-buffer 50;
stat-interval 120;
dvb-s {
lnb {
lof1 9750000;
lof2 10600000;
slof 11700000;
};
transponder {
frequency 11671000;
polarisation v;
symbol-rate 18200000;
};
};
stream {
name "Serebryany Dozhd";
input {
pnr 2100;
};
output-http {
url /serebryany_dozhd;
};
};
stream {
name "Nashe Radio";
input {
pnr 2101;
};
output-http {
url /nashe_radio;
};
};
stream {
name "Radio Teos";
input {
pnr 2103;
};
output-http {
url /radio_teos;
};
};
stream {
name "Seven Skies";
input {
pnr 2900;
};
output-http {
url /seven_skies;
};
};
};
Для 3х транспондеров, думаю, не составит труда описать.
9. Далее запускаем getstream. Используем команду:
$getstream -c /path/to/file -d
Ключ -d обозначает режим отладки и следовательно будет выводить всю информацию, и даже тех, кто подключился к серверу и на какую станцию.
Пример:
$ getstream -c getstr -d
2009-06-17 09:09:42.167 fe: Adapter 2 Setting up frontend tuner 2009-06-17 09:09:42.182 fe: DVB-S tone = 1 2009-06-17 09:09:42.182 fe: DVB-S voltage = 0 2009-06-17 09:09:42.182 fe: DVB-S diseqc = 0 2009-06-17 09:09:42.182 fe: DVB-S freq = 11050000 2009-06-17 09:09:42.182 fe: DVB-S lof1 = 9750000 2009-06-17 09:09:42.182 fe: DVB-S lof2 = 10600000 2009-06-17 09:09:42.182 fe: DVB-S slof = 11700000 2009-06-17 09:09:42.182 fe: DVB-S feparams.frequency = 1300000 2009-06-17 09:09:42.182 fe: DVB-S feparams.inversion = 2 2009-06-17 09:09:42.182 fe: DVB-S feparams.u.qpsk.symbol_rate = 3300000 2009-06-17 09:09:42.183 dmx: Setting filter for pid 8192 pestype 20 2009-06-17 09:09:42.191 fe: Adapter 0 Setting up frontend tuner 2009-06-17 09:09:42.205 fe: DVB-S tone = 1 2009-06-17 09:09:42.205 fe: DVB-S voltage = 0 2009-06-17 09:09:42.205 fe: DVB-S diseqc = 0 2009-06-17 09:09:42.205 fe: DVB-S freq = 11671000 2009-06-17 09:09:42.205 fe: DVB-S lof1 = 9750000 2009-06-17 09:09:42.205 fe: DVB-S lof2 = 10600000 2009-06-17 09:09:42.206 fe: DVB-S slof = 11700000 2009-06-17 09:09:42.206 fe: DVB-S feparams.frequency = 1921000 2009-06-17 09:09:42.206 fe: DVB-S feparams.inversion = 2 2009-06-17 09:09:42.206 fe: DVB-S feparams.u.qpsk.symbol_rate = 18200000 2009-06-17 09:09:42.206 dmx: Setting filter for pid 8192 pestype 20 2009-06-17 09:09:42.255 fe: Adapter 2 Status: 0x01 (HAS_SIGNAL) 2009-06-17 09:09:42.255 fe: Adapter 0 Status: 0x01 (HAS_SIGNAL) 2009-06-17 09:09:42.322 fe: Adapter 2 Status: 0x1f (HAS_SIGNAL HAS_CARRIER HAS_VITERBI HAS_SYNC HAS_LOCK) 2009-06-17 09:09:42.352 fe: Adapter 0 Status: 0x1f (HAS_SIGNAL HAS_CARRIER HAS_VITERBI HAS_SYNC HAS_LOCK) 2009-06-17 09:10:04.864 stream_http: connection from 10.10.10.99 for /buisnesfm 2009-06-17 09:11:42.183 dvr: inputstats: 44 pids 2722 pkt/s 511919 byte/s 2009-06-17 09:11:42.209 dvr: inputstats: 41 pids 14461 pkt/s 2718743 byte/s 2009-06-17 09:11:58.691 stream_http: connection from 192.168.1.36 for /buisnesfm 2009-06-17 09:12:04.192 stream_http: dropping connection to 192.168.1.36 for /buisnesfm 2009-06-17 09:12:04.253 stream_http: connection from 192.168.1.36 for /miliceyskaya_volna ...
На этом настройка getstream закончена.
10. Теперь создадим плейлист формата m3u, для удобства приема пользователями вещаемых каналов.
Приведу просто его листинг:
#EXTM3U
#EXTINF:-131,Business FM
http://10.10.254.254:8080/buisnesfm
#EXTINF:-131,Humor FM
http://10.10.254.254:8080/humorfm
#EXTINF:-131,Pomestnoe
http://10.10.254.254:8080/pomestnoe
#EXTINF:-131,Kino FM
http://10.10.254.254:8080/kinofm
#EXTINF:-131,Record
http://10.10.254.254:8080/record
#EXTINF:-131,Miliceyskaya volna
http://10.10.254.254:8080/miliceyskaya_volna
#EXTINF:-131,City FM
http://10.10.254.254:8080/cityfm
#EXTINF:-131,NRJ
http://10.10.254.254:8080/radio_nrj
#EXTINF:-131,Relax FM
http://10.10.254.254:8080/relaxfm
#EXTINF:-131,Radio Alla
http://10.10.254.254:8080/radio_alla
#EXTINF:-131,Metro FM
http://10.10.254.254:8080/metro_fm
#EXTINF:-131,Avtoradio
http://10.10.254.254:8080/avtoradio
#EXTINF:-131,Dorozhnoe
http://10.10.254.254:8080/dorozhnoe_radio
#EXTINF:-131,Radio Vanya
http://10.10.254.254:8080/Radio_Vanya
#EXTINF:-131,Radio Record
http://10.10.254.254:8080/radio_record
#EXTINF:-131,Piter RS
http://10.10.254.254:8080/piterfm
#EXTINF:-131,Shanson
http://10.10.254.254:8080/chanson
#EXTINF:-131,Gardarika
http://10.10.254.254:8080/gardarikafm
#EXTINF:-131,Serebryany dozhd
http://10.10.254.254:8080/serebryany_dozhd
#EXTINF:-131,Nashe radio
http://10.10.254.254:8080/nashe_radio
#EXTINF:-131,Radio Teos
http://10.10.254.254:8080/radio_teos
#EXTINF:-131,Seven Skies
http://10.10.254.254:8080/seven_skies
Теперь для прослушивания радио, клиенту надо запустить vlc и добавить в него плейлист.
В моем случае загрузка канал при вещание на одного клиента составляет около 270 кбит/с.
Теперь я опишу всяческие модернизации данного конфига.
Их может быть огромное множество. Я опишу только 2.
1. Чтобы руками не отделять каждый канал от общего пакета, полученного со спутника, можно пустить в вещание и весь пакет.
Как это сделать? Нужно просто отредактировать параметр потоков до такого вида:
stream {
name "Full";
input {
full;
};
output-http {
url /radio; #ссылка может быть любой
};
};
Теперь чтобы переключить на нужный канал в vlc необходимо, в главном меню, выбрать Воспроизведение -> Программа и из открывшегося списка выбрать нужную программу.
2. Вещание по UDP. Опять же нужно просто указать адрес на который будет вещание.
stream {
name "Full";
input {
full;
};
output-udp {
remote-address 10.10.10.99;
remote-port 1234;
sap {
scope global;
ttl 5;
playgroup "Free";
};
};
Как видно нет ничего сложного.
Заключение
Программа getstream довольно гибкая в настройке и поддерживает работу как с DVB-S, так и с DVB-C и DVB-T.
Файлы примеров настроек присутствеют в папке/usr/share/doc/getstream/examples .
Также getstream поддерживает вещание видео в локальную сеть, достаточно просто указать video-pid.
Ссылки
З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !
Автор: Andrey
