Страницы

четверг, 6 февраля 2014 г.

Олимпиада в Сочи 2014. IPTV многоканальная запись

В некоторой спешке, настраиваю настольный компьютер для непрерывной записи 5 каналов IPTV во время вещания Олимпиады в Сочи 2014. Это будет проверка в реальных условиях. Но т.к. это бесплатные каналы, качество вещание - какое будет и получиться. Плюс всякие трудности и сбои.

У меня есть заметка о настройке многоканального записывающего устройства на серверной платформе HP Microserver. Но т.к. микросервер далеко, то использовать буду домашний компьютер.
В принципе, всё тоже самое, только есть некоторые улучшения в скриптах.
Дело происходит в СПБ, провайдер Билайн, бесплатный пакет каналов.

Аппаратная платформа собственной сборки: red

Маршрутизатор Dir-320 с собственно настроенной прошивкой OpenWRT backfire.


Параллельное пишутся 24-часовые ролики, одновременно с ними запускаются и нарезанные клипы.

Содержимое cronrecords.sh


#!/bin/bash
# сервер: red
# Дата создания: 6 февраля 2014 года
# Запись олимпиады
# Постановка файла на исполнение: crontab -u user  cronrecords.sh
# user - имя пользователя в системе
# Время записи определяется первым параметром (в секундах) передаваемым скрипту
# 1 час - 3600
# 3 часа - 10800
# 4 часа - 14400
# 6 часов - 21600
# 24 часа - 86400
# Пример - Каждые 5 минут */5 * * * *
# Пример - Каждые 10 минут */10 * * * *

# 24 часовые ролики
59 23 * * * /media/gimmor/tibibyte/МЦВЗУ/первый_канал.sh 86400    2> /media/gimmor/tibibyte/МЦВЗУ/log/первый-00.cron
59 23 * * * /media/gimmor/tibibyte/МЦВЗУ/россия.sh 86400          2> /media/gimmor/tibibyte/МЦВЗУ/log/россия1-00.cron
59 23 * * * /media/gimmor/tibibyte/МЦВЗУ/россия2.sh 86400         2> /media/gimmor/tibibyte/МЦВЗУ/log/россия2-00.cron
59 23 * * * /media/gimmor/tibibyte/МЦВЗУ/россия24.sh 86400        2> /media/gimmor/tibibyte/МЦВЗУ/log/россия24-00.cron
59 23 * * * /media/gimmor/tibibyte/МЦВЗУ/нтв.sh 86400             2> /media/gimmor/tibibyte/МЦВЗУ/log/нтв-00.cron

# 3-часовые ролики, запуск перед новостями первого канала
59 08 * * * /media/gimmor/tibibyte/МЦВЗУ/первый_канал.sh 10800 2> /media/gimmor/tibibyte/МЦВЗУ/log/первый-09.cron
59 11 * * * /media/gimmor/tibibyte/МЦВЗУ/первый_канал.sh 10800 2> /media/gimmor/tibibyte/МЦВЗУ/log/первый-12.cron
59 14 * * * /media/gimmor/tibibyte/МЦВЗУ/первый_канал.sh 10800 2> /media/gimmor/tibibyte/МЦВЗУ/log/первый-15.cron
59 17 * * * /media/gimmor/tibibyte/МЦВЗУ/первый_канал.sh 10800 2> /media/gimmor/tibibyte/МЦВЗУ/log/первый-18.cron
59 20 * * * /media/gimmor/tibibyte/МЦВЗУ/первый_канал.sh 10800 2> /media/gimmor/tibibyte/МЦВЗУ/log/первый-21.cron
59 23 * * * /media/gimmor/tibibyte/МЦВЗУ/первый_канал.sh 10800 2> /media/gimmor/tibibyte/МЦВЗУ/log/первый-24.cron
59 02 * * * /media/gimmor/tibibyte/МЦВЗУ/первый_канал.sh 10800 2> /media/gimmor/tibibyte/МЦВЗУ/log/первый-03.cron
59 04 * * * /media/gimmor/tibibyte/МЦВЗУ/первый_канал.sh 14400 2> /media/gimmor/tibibyte/МЦВЗУ/log/первый-06.cron

# В 5 утра запускаем 6-часовой утренний ролик, до 11 часовых новостей
59 04 * * * /media/gimmor/tibibyte/МЦВЗУ/россия.sh 21600 2> /media/gimmor/tibibyte/МЦВЗУ/log/россия1-05.cron
# 3-часовые ролики, запуск перед новостями канала Россия 1
59 10 * * * /media/gimmor/tibibyte/МЦВЗУ/россия.sh 10800 2> /media/gimmor/tibibyte/МЦВЗУ/log/россия1-11.cron
59 13 * * * /media/gimmor/tibibyte/МЦВЗУ/россия.sh 10800 2> /media/gimmor/tibibyte/МЦВЗУ/log/россия1-14.cron
59 16 * * * /media/gimmor/tibibyte/МЦВЗУ/россия.sh 10800 2> /media/gimmor/tibibyte/МЦВЗУ/log/россия1-17.cron
59 19 * * * /media/gimmor/tibibyte/МЦВЗУ/россия.sh 10800 2> /media/gimmor/tibibyte/МЦВЗУ/log/россия1-20.cron
# С 11 вечера до 5 утра - 6-часов ночной ролик
59 22 * * * /media/gimmor/tibibyte/МЦВЗУ/россия.sh 21600 2> /media/gimmor/tibibyte/МЦВЗУ/log/россия1-23.cron


# 3-часовые ролики, канала Россия 2
00 */3 * * * /media/gimmor/tibibyte/МЦВЗУ/россия2.sh 10800 2> /media/gimmor/tibibyte/МЦВЗУ/log/россия2-3.cron


# получасовые ролики на канале Вести Россия 24
*/30 * * * * /media/gimmor/tibibyte/МЦВЗУ/россия24.sh 1800 2> /media/gimmor/tibibyte/МЦВЗУ/log/Россия24-30.cron





Чтобы поставить на исполнение надо выполнить в папке МЦВЗУ:

МЦВЗУ$ crontab -u gimmor  cronrecords.sh


Теперь сам скрипт записи, на основе которого я наплодил ещё несколько аналогичных скриптов, для каждого канала. Разница у них только в url-адресах каналов и именах записываемых файлов.

Скрипт пишет транспортный поток MPEG2-TS, что там внутри нам особо не интересно, открывает проигрыватель и ладно.


МЦВЗУ$ cat "первый_канал.sh"

#!/bin/bash
# Скрипт для видеозаписи 1 канала

# сервер: red
# Особенности:
# Выходной файл создается с датой-временем,
# при использовании русских букв в имени выходного файла
# надо использовать кавычки в команде mv
# Временные диапазоны
# 1 час - 3600
# 3 часа - 10800
# 6 часов - 21600
# 24 часа - 86400
OUTPUT_VIDEOFILE="/media/gimmor/tibibyte/Телепередачи/"`date +%Y%m%d-%T`".первый.видеозапись.ts"
echo $OUTPUT_VIDEOFILE
cvlc -vvv rtp://@233.33.210.86:5050 --sout=file/ts:$OUTPUT_VIDEOFILE --run-time $1 vlc://quit --no-audio


#notify-send "Запись телепередачи завершена $OUTPUT_VIDEOFILE"

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

Структура папок на 1TiB томе (точка монтирования /media/gimmor/tibibyte):

/Телепередачи - записанные телепередачи
/МЦВЗУ - сами скрипты
Везде желательно (обязательно) использовать полные пути, т.к. крон может не понять относительные.


Справочно. Мои настройки igmpproxy на Openwrt backfire

##------------------------------------------------------
## Enable Quickleave mode (Sends Leave instantly)
##------------------------------------------------------
# quickleave


##------------------------------------------------------
## Configuration for eth0.1 (Upstream Interface)
##------------------------------------------------------
phyint eth0.1 upstream  ratelimit 0  threshold 1
    altnet 10.0.0.0/8
    altnet 224.0.0.0/4
    altnet 78.107.196.0/22
    altnet 10.24.254.0/24
    altnet 85.21.90.0/24

##------------------------------------------------------
## Configuration for eth0.0 (Downstream Interface)
##------------------------------------------------------
phyint eth0.0 downstream  ratelimit 0  threshold 1


Справочно. Мои настройки OpenWrt файла sysctl.conf

...
# IPTV
# 02.02.2014
net.ipv4.conf.all.force_igmp_version=2
net.ipv4.conf.default.force_igmp_version=2
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0

...


Справочно. Мои настройки OpenWrt Firewall, в части относящейся к IPTV

Также надо разрешить приём udp-пакетов сетевым фильтром (файрволлом), в файле /etc/config/firewall

man - интерфейс подключения к провайдеру (его локальной сети)
lan - это интерфейс локальной сети (switch)

...

config rule
    option src 'man'
    option proto 'igmp'
    option src_ip '0.0.0.0/0'
    option family 'ipv4'
    option target 'ACCEPT'
    option name 'iptv-allow-igmp'

config rule
    option src 'man'
    option proto 'udp'
    option dest 'lan'
    option dest_ip '224.0.0.0/4'
    option family 'ipv4'
    option target 'ACCEPT'
    option src_ip '0.0.0.0/0'
    option name 'iptv-udp-forward'

...


P.S. Похоже 1TiB нехватит, т.к. 1 день получается около 150 Гб, а если ещё и с резервной нарезкой, то все 300.  Итого над 3TiB.

P.P.S. Можно добавить уведомление об окончании записи, посылкой сообщения notify-send.

7.02.2014. Ну что же, день видеозаписи прошёл. 24-часовые ролики заняли вместе 145.4Гб. Каждый около 29,6 Гб. Также записались и нарезанные клипы, правда на одном канале был сбой, из-за ошибки в скрипте (был исп. старый скрипт), это ещё ~150 Гб. Однако, принятое решение о параллельной записи привело к надежности и соответственно потерь видеоинформации не случилось.
Тома, размером 1,1 TiB хватит на 4 дня записи. Так что надо бежать в лавку за 4ТБ винчестером.
Единственное что, это всё же не HD запись, так что тут упущение.
Однако получается, что одномоментно записывается 10 потоков IPTV.
Температура винчестеров около 30-31 градусов.

Входящий трафик при записи 5+5 каналов

~ 3 МБита на канал, 2 записывающих процесса на канал, а трафик не удваивается. Multicast рулит, т.е. чтобы забить входящий интерфейс мне нехватает playlista :-)

Загрузка процессора AMD-A10 - 30% Vlc (визуальный просмотр канала), 26% Gnome 3, 3-4% на один записывающий процесс, а их 10, Firefox 10-16%, и по мелочи.


8.02.2014. Около 15.40 случилось кратковременное отключение питания. Компьютер автоматические не загрузился (перешёл в непонятное состояние, помогло только выключение).
Роутеру хватило конденсаторов в блоке питания и он продолжил свою работу. Мультикаст не отрубился, хотя подписчики все исчезли :-). Потерялась видеоинформация 3-часовая (период 15-18), и 24-часовая (не сформирован полный файл).
Вывод: UPS либо часовая нарезка, чтобы сократить потери.

18.02.2014. Из-за истекания аренды IP-адреса на MAN интерфейсе (локалка Билайна) происходит падение igmpproxy. Адрес выдаётся тот-же. Поэтому надо мониторить и этот факт. Так что 18 числа опять потеря видеоинформации.
Запуск igmpproxy (в консоли роутера) восстанавливает подачу данных.

21.02.2014. Эксперимент прекратил. Т.к. роутер стал подвисать + видеоинформация получается некачественная, с рассинхронизацией звука и рассыпанием картинки.

Комментариев нет: