Создаём ТВ-сервер дома на Linux
Друзья, сегодня поговорим о том, как создать свой собственный ТВ-сервер для последующей раздачи видео потоков на любые устройства домашней сети, а также за её пределами на Android устройствах.
Идея создать свой собственный ТВ-сервер пришла из-за того, что в моем телевизоре Sony отсутствует ТВ-тюнер стандарта DVB-T2, а есть только DVB-T. Я мог бы купить обычный ТВ-тюнер за 1000 рублей и подключить его к телевизору, но цифровое ТВ у меня было бы только на одном устройстве, поэтому я решил пойти немного дальше и расширить данный функционал. ТВ-тюнеров пришлось покупать 2-е штуки, т.к. эфирное цифровое ТВ в России состоит из двух мультиплексов и чтобы смотреть ТВ на всех девайсах одновременно для каждого мультиплекса нужно взять отдельный тюнер, т.к. частота мультиплексов разная — для первого она составляет 474МГц, а для второго 658МГц.
Вам понадобится
- Домашний сервер с операционной системой Centos 7
- ТВ-тюнер Rombica Pro DVB-T2 – 2шт.
- Внешняя уличная антенна – 1шт.
- Антенный сплиттер DEXP SA2D на 1000МГц – 1шт.
- Антенный переходник Pro Legend F — RG6 — 5шт.
- Антенный переходник Pro Legend TV — F — 2шт.
- Антенный кабель с волновым сопротивлением 75ом
- Как минимум два USB 2.0 входа на домашнем сервере
Шаг 1 : Ставим операционную систему CentOS 7
Установку CentOS 7 будем производить с флешки. Для этого нам нужно скачать дистрибутив CentOS 7 без графической оболочки (GUI):
http://ftp.nsc.ru/pub/centos/7.7.1908/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iso
Далее, Скачиваем программу Rufus для Windows:
https://github.com/pbatard/rufus/releases/download/v3.9/rufus-3.9.exe
Запускаем Rufus на отдельной машине с Windows и указываем ISO-файл операционной системы:
Нажимаем кнопку START и создаём загрузочную флешку.
Далее, заходим в BIOS материнской платы сервера (обычно это нажатие кнопок F2 или F10 при загрузке) и указываем флешку как диск с которого должна осуществляться загрузка системы. Сохраняем настройки и перегружаем сервер. Следуем указаниям установщика и ставим CentOS 7. Перегружаем систему и заходим в CentOS с помощью заданного при установке логина и пароля.
Шаг 2 : Компилируем свежее ядро для CentOS 7
Компилировать свежее ядро нужно для того, что оно в итоге «увидело» файлы драйверов ТВ-тюнера в папке /lib/firmware/. Ядро идущее по умолчанию с дистрибутивом CentOS 7 по какой-то причине не «видит» драйвера ТВ-тюнера. В моем случае я ставил версию ядра 5.1.15.
Скачиваем исходники ядра. Заходим в терминал и набираем:
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.15.tar.xz
Распаковываем архив:
tar -xvf linux-5.1.15.tar.xz
Далее, скачиваем самый новый компилятор из набора devtoolset-8 и инструменты разработки для компиляции ядра:
sudo yum update sudo yum groupinstall 'Development Tools' sudo yum install centos-release-scl sudo yum install devtoolset-8 sudo yum install ncurses-devel make gcc bc bison flex elfutils-libelf-devel openssl-devel grub2
Активируем компилятор для текущей сессии терминала:
sudo scl enable devtoolset-8 bash
Проверяем версию компилятора:
gcc --version
gcc (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3) Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Перед началом сборки ядра необходимо настроить конфигурацию ядра Linux. Вы также должны указать, какие модули ядра (драйверы) необходимы для вашей системы. Я предлагаю вам скопировать существующий файл конфигурации с помощью команды cp:
cd linux-5.1.15 cp -v /boot/config-$(uname -r) .config
Начинаем компиляцию нового ядра:
make -j $(nproc)
Ребят, компиляция и сборка ядра Linux занимают значительное количество времени. Время сборки зависит от ресурсов вашей системы, таких как количество ядер процессора и текущая загрузка системы. Так что наливайте кофе и кушайте булочку :)
Устанавливаем модули ядра Linux:
sudo make modules_install
И наконец, устанавливаем само ядро Linux:
sudo make install
Эта команда установит три файла в папку /boot, а также внесёт изменения в ваш файл конфигурации grub:
initramfs-5.1.15.img System.map-5.1.15 vmlinuz-5.1.15
Вам также нужно изменить настройки загрузчика Grub 2. Введите следующую команду в командной строке в соответствии с вашим дистрибутивом Linux:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg sudo grubby --set-default /boot/vmlinuz-5.1.15
Перегружаем сервер:
sudo reboot
Проверяем текущую версию ядра командой:
uname -mrs
Linux 5.1.15 x86_64
Снова активируем компилятор для текущей сессии терминала:
sudo scl enable devtoolset-8 bash
Шаг 3 : Ставим V4L-DVB драйверы для ТВ-тюнеров
Вставляем ТВ-тюнеры в USB порты на сервере и через ТВ-сплиттер соединяем их с внешней уличной антенной.
Далее вводим в терминале:
git clone --depth=1 git://linuxtv.org/media_build.git cd media_build sudo ./build
Перегружаем сервер
sudo reboot
Шаг 4 : Устанавливаем ТВ-сервер TVHeadend
Самый простой способ установить ТВ-сервер для CentOS 7 это через Snap.
В терминале вводим:
sudo yum install epel-release sudo yum install snapd sudo systemctl enable --now snapd.socket sudo ln -s /var/lib/snapd/snap /snap sudo snap install tvheadend
Далее, открываем порты 9981, 80 и 443 на сервере:
sudo firewall-cmd --add-port=9981/tcp --permanent --zone=public sudo firewall-cmd --add-port=80/tcp --permanent --zone=public sudo firewall-cmd --add-port=443/tcp --permanent --zone=public sudo firewall-cmd —reload
После установки открываем браузер на другом компьютере, подключённому в локальную сеть, и вводим адрес:
http://[IP-адрес]:9981
где [IP-адрес] — локальный IP-адрес вашего сервера на CentOS.
Следуем указаниям Помощника, но хочу выделить основные моменты:
В поле Language: выбираем либо русский, либо английский
Allowed network: вводим 0.0.0.0/0
Admin username: придумываем логин на английском
Admin password: придумываем пароль на английском
Tuner: выбираем DVB-T
Predefined-muxes: выбираем DTT — Russian Federation
После всех манипуляций начнётся процесс сканирования мультиплексов.
Далее, ставим галочки на:
Map all services
Create provider tags
Create network tags
Самое простое, чтобы проверить настроенные каналы — сделать это через VLC проигрыватель. Ставим его на другой Linux машине с Ubuntu через snap (для Windows он также имеется):
sudo snap install vlc
Далее, в домашней папке этой машины с Ubuntu создаём файл TV.m3u:
nano ~/TV.m3u
и вводим в нем всего одну строчку:
http://[IP-адрес]:9981/playlist/channels
Где [IP-адрес] — локальный IP-адрес вашего сервера на CentOS.
Сохраняем файл.
Двойным нажатием открываем его в VLC. Далее, VLC попросит вас ввести логин и пароль. Введите туда Admin username и Admin password, которые вы придумали ранее.
На телевизоре к ТВ-серверу я подключился через приставку KODI и приложение TVHeadend client. Там все предельно просто.
Шаг 5 : Просмотр ТВ на смартфоне с Android вне домашей сети
Чтобы сделать возможным просмотр ТВ на смартфоне с Android вне домашней сети, нужно:
1. Поставить приложение VLC на смартфоне.
2. Иметь фиксированный IP-адрес вашего роутера дома и сделать проброс 80-го и 443-го порта до сервера.
3. Иметь доменное имя привязанное к IP-адресу вашего роутера.
4. Поставить web-сервер nginx
sudo yum install nginx
Открываем файл nginx.conf:
sudo nano /etc/nginx/nginx.conf
и вставляем в него строки:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { client_max_body_size 256M; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; server_names_hash_bucket_size 64; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server_tokens off; server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { index index.php index.html index.htm; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
В папке /etc/nginx/conf.d/ создаем файл tvheadend.conf:
sudo nano /etc/nginx/conf.d/tvheadend.conf
И добавляем в него строки:
server { listen 80; server_name domain.ru; set $root_path /var/www/domain.ru/html; root $root_path; }
domain.ru – будет ваше собственное доменное имя.
Также создадим папку сервера:
mkdir /var/www/domain.ru/html/ mkdir /var/www/domain.ru/log/ sudo chown nginx:nginx /var/www/domain.ru/html/* sudo chown nginx:nginx /var/www/domain.ru/log/*
Стартуем nginx и добавляем его в автозагрузку:
sudo systemctl enable nginx sudo systemctl start nginx
5. Установить сертификат безопасности для nginx от Let’s Encrypt:
Ребят, вы же не хотите, чтобы кто-то перехватил ваши пароли от ТВ-сервера, скажем, когда вы подключаетесь к какому-то публичному беспроводному интернету, и потом без вашего разрешения какой-нибудь кул-хацкер подключался к вам? Думаю нет :)
Ставим Let’s Encrypt и получаем секретный и публичный ключ:
sudo yum install certbot python2-certbot-nginx sudo certbot --nginx
В терминале следуем указаниям помощника.
6. Снова открываем файл tvheadend.conf:
sudo nano /etc/nginx/conf.d/tvheadend.conf
стираем все и вставляем в него следующее содержимое:
server { listen 80; server_name domain.ru; return 301 https://domain.ru$request_uri; } server { listen 443 ssl; server_name domain.ru; set $root_path /var/www/domain.ru/html; ssl_certificate /etc/letsencrypt/live/domain.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain.ru/privkey.pem; access_log /var/www/domain.ru/log/nginx-ssl-requests.log; error_log /var/www/domain.ru/log/nginx-ssl-error.log; root $root_path; location /tvh/ { proxy_pass http://127.0.0.1:9981/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /stream/ { proxy_pass http://127.0.0.1:9981/stream/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
Ещё раз напоминаю, что domain.ru – будет ваше собственное доменное имя.
Перегружаем nginx:
sudo systemctl restart nginx
7. На смартфоне в папке /storage/emulated/0/Download/ создаём файл TV.m3u с помощью приложения ESFileExplorer и вставляем в него одну строчку:
https://domain.ru/tvh/playlist/channels
Сохраняем файл и запускаем его с помощью VLC. Программа также запросит логин и пароль. Вводим их и смотрим своё домашнее телевидение из любой точки земного шара.
Profit :)
Понравилась инструкция? Тогда поделитесь ей со своими друзьями или попробуйте написать свою собственную!