Организация IPTV-трансляции

Началось все с того, что сеть начала расти и нужно было предоставлять пользователям ресурсы, кроме как доступ в интернет. Так как, наша компания кроме предоставления услуг доступа в интернет, занимается еще кабельным аналоговым и цифровым телевидением, то было решено организовать вещание телевидения в IP-сеть.
Итак, Дано:
В качестве источника потока использовались спутниковые ресиверы DCH-4000P китайской фирмы PBI.

image

image

Так как, один такой ресивер позволяет получать на выходе только 6 мультикастовых каналов, купили IP Streamer IPS-01 одесской фирмы Спец-ТВ. Поэтому, поток будем брать не через IP, а с ASI выхода.

image

У него 6 ASI входов, на которые мы будем подавать потоки с шести ресиверов PBI. Так как выходной порт у стримера гигабитный и в потоке находятся все наши каналы, нужно было сделать так, чтобы к клиенту на сетевой интерфейс попадали не все 60 каналов, и занимали всю пропускную способность сети (поток около 300Мбит/с), а только тот канал, который он запросит. В принципе можно было реализовать такую функцию на коммутаторах D-Link, но знакомые твердили что D-Link-и плохо себя показывают в качестве querier'ов. Вообщем было решено купить управляемый L2 коммутатор FoxGate S-6224-S2.

image

Передавать абонентам будем через коммутатор D-Link DES-3526.

image

Схема коммутации следующая, нарисована на скорую руку:

image

Итак, приступим к настройке.

Настройка ресиверов сводится к обычной настройке спутникового ресивера, а настройка стримера к щелканью в браузере по каналам и присвоению каждому мультикастового адреса вида 239.255.х.х. Поэтому на настройке данного оборудования я останавливаться не буду.

Начнем с конфига querier'а Foxgate S6224-S2, IP-адрес нашего коммутатора 10.0.0.10:

1. Создаем отдельный vlan:

vlan 229

2. Включаем контроль мультикаст-потока:

multicast destination-control

3. Настраиваем порты:

Interface Ethernet0/0/2
switchport access vlan 229
...
...
...
!
Interface Ethernet0/0/24
switchport access vlan 229


4. 25 порт смотрит в сторону стримера, а 26 в сторону коммутатора, поэтому 26 порт делаем транковым:

Interface Ethernet0/0/25
switchport access vlan 229
!
Interface Ethernet0/0/26
switchport mode trunk


5. Включаем igmp snooping и говорим, что наш vlan является мультикастовым:

ip igmp snooping
ip igmp snooping vlan 229

6. Включаем функцию querier'а и говорим, что источником является сам коммутатор:
ip igmp snooping vlan 229 l2-general-querier
ip igmp snooping vlan 229 l2-general-querier-source 10.0.0.10


Все, на этом настройка querier'а завершена.

Перейдем к D-Link'у (25-26 порты в качестве аплинка):

1. Включаем igmp snooping и говорим, что наш vlan 229 является мультикастовым:

enable igmp_snooping
create igmp_snooping multicast_vlan multicast 229


2. Говорим, что абонентские порты 1-24, а в качестве источника используем 25 и 26:

config igmp_snooping multicast_vlan multicast state enable replace_source_ip 0.0.0.0 member_port 1-24 source_port 25-26

3. Данная опция нужна, чтобы мультикаст не шел на все порты подряд:

config igmp_snooping multicast host_timeout 260 router_timeout 260 leave_timer 2 state enable
config igmp_snooping querier multicast query_interval 125 max_response_time 10 robustness_variable 2
config igmp_snooping querier multicast last_member_query_interval 1 state disable


4. Выключаем фильтеринг на магистральных портах (на всякий случай):

config limited_multicast_addr ports 25-26 access deny state disable

5. Запрещаем клиентам вещать свои каналы, вернее просто никто не сможет их смотреть:

config multicast port_filtering_mode 1-24 filter_unregistered_groups
config multicast port_filtering_mode 25-26 forward_unregistered_groups


На данном этапе настройка коммутатора завершена.

Создаем плейлист channels.m3u со следующим содержанием:

#EXTM3U
#EXTINF:0,РТР-Планета
udp://@239.255.1.1:1234
#EXTINF:0,НТВ-Мир
udp://@239.255.1.2:1234
#EXTINF:0,ТНТ
udp://@239.255.1.3:1234
#EXTINF:0,СТС-Москва
udp://@239.255.1.4:1234
#EXTINF:0,Премьера
udp://@239.255.1.5:1234
.
.
.
#EXTINF:0,Дом Кино
udp://@239.255.1.60:1234


Открываем его например vlc и наслаждаемся просмотром.

Позже я столкнулся с проблемой, у меня дома стоит сервер с Ubuntu на борту и внешним IP-адресом + точка доступа, который используется в качестве роутера для домашней сети, и встал вопрос о том, как собственно смотреть IPTV. Решение нашлось быстро с помощью igmproxy, однако разочарование не долго заставило себя ждать. Картинка рассыпалась, а про просмотр через wi-fi вообще можно было не мечтать, т.к. поток мультикаста перегружал мою 54Мбит/с точку доступа. Погуглив стало понятно, что будет лучше поток преобразовывать из UDP в HTTP. Это можно осуществить с помощью программы udpxy.

Устанавливаем ее и создаем стартовый скрипт:

#!/bin/sh

if [ -n "`pidof udpxy`" ] ;then
/usr/bin/killall udpxy > /dev/null 2>&1
fi
/usr/local/bin/udpxy -a eth0 -m eth1 -p 8888
#eth0 - смотрит в локальную сеть
#eth1 - в сторону провайдера
#8888 - порт на котором будет идти трансляция, можно выбрать любой свободный


Осталось положить наш скрипт в /etc/init.d/.

Запускаем:

/usr/local/bin/udpxy -a eth0 -m eth1 -p 8888

Проверим:

zeleniy@promeline:~$ ps ax | grep udp
1970 ? S 0:00 /usr/local/bin/udpxy -a eth0 -m eth1 -p 8888
15231 pts/0 D+ 0:00 grep --color=auto udp


Статистика доступна по адресу:

http://172.16.0.1:8888/status


Серверная часть готова. Чтобы клиенты смогли смотреть нашу трансляцию необходимо создать плейлист следующего содержания:

#EXTM3U
#EXTINF:0,RTR-PLANETA
http://172.16.0.1:8888/udp/239.255.1.1:1234
#EXTINF:0,DOM KINO
http://172.16.0.1:8888/udp/239.255.1.2:1234
#EXTINF:0,TVCI
http://172.16.0.1:8888/udp/239.255.1.3:1234
#EXTINF:0,BIBIGON
http://172.16.0.1:8888/udp/239.255.1.4:1234
#EXTINF:0,RBK-TV
http://172.16.0.1:8888/udp/239.255.1.5:1234


Теперь даже по wi-fi можно с комфортом посмотреть любимые передачи.
Источник статьи