Захват мультикаста¶
Flussonic Media Server умеет захватывать видео, передаваемое мультикастом по протоколу UDP MPEG-TS, включая RTP-инкапсуляцию.
В компьютерных сетях мультикаст, отправленный с источника, останавливается на первом же коммутаторе и не проходит дальше, пока потребитель в сети явно не запросит получение данных, отправляемых в мультикаст-группу. Такой запрос выполняется по протоколу IGMP и инициируется ядром ОС, а не ПО, которое не имеет доступа к запросам. Пока ПО работает, ядро переотправляет запросы IGMP коммутатору, продлевая действие запроса данных из мультикаст-группы. Без запросов IGMP коммутатору потребитель перестанет получать мультикаст уже через несколько секунд.
Содержание:
- Требования
- Захват SPTS
- Выбор интерфейсов
- Захват MPTS
- Тюнинг ОС
- Проблемы с захватом
- Проблемы с коммутаторами
- Проблемы с адресами мультикаст-групп
Требования¶
- Выделенный сервер с установленным Media Server. Виртуальный сервер может не подойти из-за особенностей работы мультикаста и высокой сложности настройки сети.
- Источник нешифрованного мультикаста. Вам нужно знать его адрес мультикаст-группы и порт. В простом случае начните с SPTS-источника, т.е. один канал — одна группа. Затем можете перейти к MPTS и инкапсуляции T2-MI.
Захват SPTS из источника сервером с одним интерфейсом¶
Если на сервере один сетевой интерфейс, то сделайте следующее:
- Создайте поток с некоторым именем.
- Укажите источник вида
udp://239.0.0.1:1234
:
stream example {
input udp://239.0.0.1:1234;
}
Проигрывая видео и аудио в браузере, вы можете столкнуться со следующими трудностями:
- Если у вас видео с кодеками H.264 (AVC) или H.265 (HEVC), то видео будет проигрываться, но не на всех смартфонах Apple. Если у вас видео с кодеком MPEG-2, то для проигрывания видео потребуются специализированные программы, например, VLC.
- В мультикасте аудио передаётся в кодеках MPEG-2 audio или AC-3. Оба варианта не проигрываются в браузере.
Поэтому достаточно убедиться в следующем:
- поток активен,
- время жизни потока растёт без разрывов,
- входящий битрейт совпадает с ожидаемым, варьирующимся от 1 до 10 Мбит:
Выбор интерфейсов¶
Как правило сервер, захватывающий мультикаст, имеет более одного интерфейса. Один интерфейс подключен к локальной сети, чтобы получать видео, а другой интерфейс подключен к Интернету, чтобы отправлять видео по HLS или HTTP MPEGTS и скачивать обновления.
Маршрут по умолчанию назначен на внешний интерфейс, поэтому ядро ОС будет отправлять запросы IGMP на внешний интерфейс. Так Flussonic Media Server не сможет получать видео.
Чтобы явно указать интерфейс, через который требуется запрашивать и получать мультикаст, добавьте его название в адрес источника перед адресом мультикаст-группы:
stream example {
input udp://eth2@239.0.0.1:1234;
}
Если по какой-то причине вам удобнее указать IP-адрес интерфейса, на который отправлять запрос IGMP, то укажите его в адресе источника после адреса мультикаст-группы. Например, если на интерфейсе eth2
сервер имеет IP-адрес 10.100.200.3
, то конфигурация будет иметь следующий вид:
stream example {
input udp://239.0.0.1:1234/10.100.200.3;
}
Захват MPTS¶
Чтобы захватить мультипрограммный транспортный поток (MPTS), используйте вместо udp://
специальные опции с указанием протокола. Подробнее об MPTS
Тюнинг ОС¶
Настройки Linux по умолчанию не позволяют захватывать видео по UDP без потерь, поэтому надо серьезно увеличивать размеры сетевых буферов.
Подробная информация об этом есть в статье про настройку производительности.
Важно также отметить, что для HD каналов рекомендуется размер буферов порядка 16 мегабайт.
Проблемы с захватом¶
С мультикастом часто бывают разнообразнейшие проблемы. Если у вас есть проблемы с качеством захватываемого мультикаста, можете попробовать проверить, в чём именно проблема.
Во-первых, вам надо полностью убрать все настройки firewall. iptables -F
. Сначала надо сделать чтобы работало, потом всё остальное. В некоторых дистрибутивах Linux (например, CentOS) по умолчанию идут жесткие правила для iptables.
Также нужно отключить rp_filter, чтобы не было проблем с маршрутизацией. Flussonic сам отключает rp_filter только на том сетевом интерфейсе, где вы включаете прием мультикаста, чтобы не повышать уязвимости системы к сетевым атакам. Если по каким-то причинам Flussonic не смог отключить rp_filter, сделайте это вручную:
sysctl -w 'net.ipv4.conf.eth0.rp_filter=0'
и
sysctl -w 'net.ipv4.conf.all.rp_filter=0'
При необходимости измените eth0
на нужный интерфейс.
Далее, следует понимать, что когда вы настроите мультикаст во Flussonic Media Server и будете смотреть видео с Flussonic Media Server, на качество видео влияет множество факторов: качество сигнала, качество захвата, работа сервера и качество вашей сети.
Проблемы, которые вы увидите в такой конфигурации, будут говорить только о том, что у вас проблемы, но никак не о работе Flussonic Media Server. Особенно это проявляется при отладке работы HD каналов: смотреть без затыков 10 мегабит видео могут считаные проценты пользователей.
Например, если вы запустите:
/opt/flussonic/contrib/multicast_capture.erl udp://239.0.0.1:1234/10.100.200.3 output.ts
запишете секунд 30 видео, скопируете себе на компьютер и посмотрите видео в VLC, то вы получите неискаженную картину того, как мультикаст приходит на сервер. Этот скрипт не распаковывает MPEG-TS, а пишет сырой мультикаст на диск.
Если на этом этапе вы получили хорошее ровное видео, то можно идти дальше и запускать на самом сервере:
curl -o output.ts http://127.0.0.1:80/example/mpegts
Таким образом, вы получите видеопоток, который был захвачен Flussonic Media Server, распакован и упакован обратно в MPEG-TS. Этот файл надо скачать себе на компьютер и посмотреть локально, чтобы убедиться в том, что ваше качество канала не влияет на эксперименты.
Если на этом этапе видео тоже хорошее, а при просмотре с Flussonic Media Server дергается, проблема скорее всего в том, что канала не хватает на передачу видео с Flussonic Media Server к вам.
Проблемы с коммутаторами¶
Иногда проблемы возникают с настройками коммутаторов. Например, у одного клиента возникла проблема с ограничением на количество принимаемых каналов. Оказалось, что стоит лимит на количество подписок на одном порту. Это можно выяснить следующей командой:
#debug igmp snooping all
При этом появляются сообщения:
%Jun 25 15:12:18 2015 SrcIP is 192.168.121.2, DstIP is 226.2.1.16
%Jun 25 15:12:18 2015 Groups joined have reached the limit, failed to add more groups
В данном случае получилось починить с помощью команды:
#ip igmp snooping vlan XX limit group <1-65535>
Проблемы с адресами мультикаст-групп¶
В определенных случаях на головных станциях возникают проблемы с адресами мультикаст-групп в диапазоне от 224.0.0.0
до 239.1.1.1
. Поэтому рекомендуется использовать адреса мультикаст-групп от 239.1.1.1
и выше. Все, что ниже, иногда могут не работать.