На днях появилась интересная задача: транслировать табло вылетов по кабельному телевидению в гостиничном комплексе через TV-станцию WISI с процессорами A2B ESX-200.
Проанализировав все подобные темы в интернете пришёл к такому вполне надёжному и стабильному решению:
1. Авторизуемся на сайте, где представлено табло вылетов самолётов, переводим формат сайта в файл pdf. С этой задачей справилась программа wkhtmltopdf. Стоит отметить, что я испробовал и другие утилиты, но возникала то проблема с авторизацией на сайте (работал только Basic-Auth — метод), то проблема с кодировкой и др. В общем решил остановится на wkhtmltopdf.
2. Полученный pdf-файл конвертируем в 25 одинаковых картинок (можно больше) формата .png (формат может быть и другой, но я взял .png). С этой задачей справляется простенькая программа на php с установленным расширением imagick.
3. Из полученных картинок собираем видеофайл для трансляции по сети. Этой функцией занимается утилита ffmpeg.
4. Трансляцию в сеть IP осуществляет программа tsplay. Стоит отметить, что это почти единственная нормальная программа, которая вещает в сеть видео. Я пробовал разные варианты на различных ОС, однако всегда были проблемы совместимости с ТВ-тюнерами (потеря синхронизации изображения и звука). Причём, например, vlc потреблял очень много системных ресурсов при трансляции.
—
Теперь подробней.
OS
Ставлю ОС CentOS7 под VmWareESXi6.0 выделяю на сервере HP DL380G7 1 ядро CPU 3,2GHz из 32х и 2Gb оперативки из 64Gb. CentOS ставлю из образа для минимальной установки системы CentOS-7-x86_64-Minimal-1611.iso (потом всё-равно обновлять). Как выяснилось в процессе постепенной реализации задачи — лучше было бы реализовать всё на Debian, так как в состав его дистрибутивов уже входят многие необходимые для проекта программы. Ну да ладно — чем сложнее, тем лучше!
После того, как CentOS установился (в процессе установки необходимо было задать суперпользователя и админа, выбрать русский язык, а также выключить все secure-примочки и поднять сеть по DHCP) сразу обновляем систему и ядро. Если выход в интернет реализован через proxy-сервер, то его необходимо сконфигурить для yum: #vi /etc/yum.conf добавляем строчку типа:
proxy=http://192.168.10.200:3128.
Также можно добавить в переменные окружения proxy (но пока это не обязательно):
export proxy=http://192.168.10.200:3128
export http_proxy=http://192.168.10.200:3128
export ftp_proxy=http://192.168.10.200:3128
export https_proxy=http://192.168.10.200:3128
Все настройки для простоты я делаю с root-а (без заморочек с sudo). Таким образом, на всё у меня ушло около 4-х часов и задача была решена! Если помешаться на безопасности, то можно запретить прямой логин пользователя root через ssh и поднять iptable с правилами.
Для обновления системы делаем #yum update и жмём везде y.
После ставим файловый менеджер mc: #yum install mc
Отключать selinux: /etc/selinux/config: SELINUX=disabled
Чтобы трафик нормально ходил отключаем встроенный Firewall:
#systemctl mask firewalld
#systemctl stop firewalld
Если нужно, возвращаем привычный iptable:
#yum -y install iptables-services
#systemctl enable iptables
Добавляем репозиторий epel потому как нам нужны из него кое-какие программы:
#yum -y install epel-release
Добавляем набор программера (потому как придётся покомпилить):
#yum groupinstall «Development Tools»
Системные и TOP-утилитки:
#yum install iperf htop iptstate net-tools psmisc ntpdate
Небольшой тюнинг системы:
#systemctl disable postfix — выключим отправку почты
Меняем параметры сетевого интерфейса на статику (если необходимо) в файле /etc/sysconfig/network-scripts/ifcfg-имя интерфейса комментируем все строчки и добавляем (ens32 — имя интерфейса):
#—static—
TYPE=»Ethernet»
BOOTPROTO=»static»
DEVICE=»ens32″
NAME=»ens32″
##HWADDR=00:00:00:00:01:01
IPADDR=192.168.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
IPV6INIT=»no»
ONBOOT=»yes» После всех этих процедур ребутимся и добавляем DNS в файл /etс/resolv.conf:
nameserver 192.168.10.254
nameserver 8.8.8.8
1. wkhtmltopdf
Linux | 0.12.4 | 32-bit / 64-bit | depends on: zlib, fontconfig, freetype, X11 libs (libX11, libXext, libXrender) | | |
Предварительно необходимо установить все указанные зависимости:
#yum install zlib fontconfig freetype libX11 libXext libXrender
Эта программа представляет собой готовый исполняемый ELF-файл, который находится в каталоге /bin архива (файл wkhtmltopdf нужно скопировать в папку проекта со скриптами).
Однако, несмотря, что у нас в переменных окружения LANG=ru_RU.UTF-8 кириллица будет отображаться при конвертировании страниц — крокозяблами. Причина — отсутствие нужных шрифтов. Я нашёл очень простой способ: дабы не искать недостающий шрифт устанавливаю входящую в дистрибутив программу htmldoc. Она нам не нужна (хотя тоже можно использовать вместо wkhtmltopdf), но в процессе установки подтянутся нужные шрифты:
#yum install htmldoc
Запускаемый скрипт граба сайта в PDF-документ #http_to_pdf.sh:
#!/bin/sh
/home/airlift/wkhtmltopdf —quiet —page-height 297 —page-width 180 —margin-bottom 5 —margin-left 15 —margin-right 12 —margin-top 8 —orientation Landscape —encoding windows-1251 http://login:password@local.airtablo.ru /home/airlift/temp/tablo.pdf
exit 0
2. PHP+ImageMagick
#yum install ImageMagick ImageMagick-devel
#yum install php php-devel php-pear
#pecl install imagick (если интернет через proxy — необходимо задать переменные окружения)
Далее необходимо добавить extension=imagick.so в файл /etc/php.ini
либо можно это сделать красиво: #echo ‘extension=imagick.so’ > /etc/php.d/imagick.ini
Проверяем:
#php -m |grep imagick
imagick
Собственно запускаемый скрипт для конвертации PDF->PNG #pdf_to_png.sh:
#!/usr/bin/php
$pdf_file = ‘/home/airlift/temp/tablo.pdf’;
$im = new imagick($pdf_file.»[0]»);
$i=0;
foreach($im as $_img) {
$i++;
$_img->setResolution(300, 300);
$_img->setImageFormat(‘png’);
for ($i = 0; $i <= 50; $i++) {
$_img->writeImage(«/home/airlift/temp/tablo$i.png»);
}
}
$im->destroy();
?>
Скрипт генерит в папку /home/airlift/temp/ 50 картинок tablo№.png
$pdf_file.»[0]» — указывает, что берётся только первая страница pdf-файла.
3. FFMPEG
Импортируем и устанавливаем репозитории:
#rpm -ivh https://www.mirrorservice.org/sites/dl.atrpms.net/el7-x86_64/atrpms/stable/atrpms-repo-7-7.el7.x86_64.rpm
#yum update
#yum install ffmpeg ffmpeg-compat ffmpeg-compat-devel ffmpeg-devel ffmpeg-libs
# Скрипт конвертации нескольких картинок в видео-файл:
#!/bin/sh
ff_mpeg=»/usr/bin/ffmpeg»
#параметры конвертации (в зависимости от модели IP TV-процессора):
params=»-y -v 8 -vcodec mpeg2video -r 25 -b:v 10M -pix_fmt yuv420p -vf scale=720:576:flags=spline -s 720×576 -acodec mp2 -b:a 64k -f mpegts»
$ff_mpeg -i «/home/airlift/temp/tablo%d.png» ${params} «/home/airlift/video/tablo.ts»
exit 0
4. TSPLAY
Данная утилита для трансляции видео по сети входит в набор утилит tstools.
Этот набор необходимо скачать
отсюда в виде .zip-архива и поместить на сервер. Далее распаковываем архив во временной директории и в ../tstools запускаем сборку из исходников:
#make
после того, как компиляция пройдёт успешно (если нет, то необходимо установить зависимое ПО и повторить процесс заново) — устанавливаем набор утилит:
#make install
Скрипт запуска трансляции видео из заданной папки #broadcast.sh:
#!/bin/sh
/usr/local/bin/tsplay /home/airlift/video/tablo.ts 10.10.1.50:1234 -loop -q
exit 0
Теперь нужно объединить все процессы вместе:
для этого можно создать скрипт #tablo_grab.sh:
#!/bin/sh
#На всякий случай удаляем зависшие процессы
/usr/bin/killall -q -9 http_to_pdf.sh
/usr/bin/killall -q -9 pdf_to_png.sh
/usr/bin/killall -q -9 png_to_mpeg_any.sh
#echo «html_to_png»
/home/airlift/http_to_pdf.sh
#echo «pdf_to_png»
/home/airlift/pdf_to_png.sh
#echo «png_to_mpeg»
/home/airlift/png_to_mpeg_any.sh
exit 0
Далее настраваем планировщик CRON:
создаём файл задания airlift_broadcast в папке /etc/cron.d/:
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# Скрипт запуска трансляции видео (проверка живучести каждую минуту)
*/1 * * * * root /usr/bin/flock -n /tmp/broadcast.lock -c «/home/airlift/broadcast.sh»
создаём файл задания start_tablo_grab в папке /etc/cron.d/:
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# Скрипт запуска трансляции видео (исполнение каждую минуту)
*/1 * * * * root /usr/bin/flock -n /tmp/tablograb.lock -c «/home/airlift/tablo_grab.sh»
Благодаря утилите flock запускается только одна копия процесса.
Если нужна защита iptable, можно настроить правила создав папку /etc/iptables.
Поместим в эту папку скрипт #iptable_restart.sh:
#!/bin/bash
# Задаём путь к исполняемому файлу IPTABLES
export IPTABLES=»/sbin/iptables»
# Очистка всех цепочек iptables
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -X
########################################################################
# Правила по умолчанию
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT
# Разрешить входящие соединения с localhost
$IPTABLES -A INPUT -i lo -j AC
CEPT
# Разрешить уже установленные входящие соединения
$IPTABLES -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT
# Разрешить SSH
$IPTABLES -A INPUT -p TCP —dport 22 -j ACCEPT
# Разрешить HTTP порт
#$IPTABLES -A INPUT -p TCP —dport 80 -j ACCEPT
# Разрешить пинг
$IPTABLES -A INPUT -p icmp —icmp-type time-exceeded -j ACCEPT
$IPTABLES -A INPUT -p icmp —icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A INPUT -p icmp —icmp-type echo-reply -j ACCEPT
$IPTABLES -A INPUT -p icmp —icmp-type echo-request -j ACCEPT
#########################################################################
# Записываем правила
/sbin/iptables-save > /etc/sysconfig/iptables
# Перезагружаем iptables и применяем правила
service iptables restart
# Вывод информации о состоянии таблиц.
route -n
$IPTABLES -L
$IPTABLES -L -v -n
$IPTABLES -L -v -n -t nat
#—————————- the end ———————————————————————
Посмотреть статистику сетевых соединений можно утилитой #iptstate
Автор: BlackMore Black
Дата публикации: 2017-09-15T10:37:00.002+07:00