Создаём ТВ-сервер дома на Linux

Друзья, сегодня поговорим о том, как создать свой собственный ТВ-сервер для последующей раздачи видео потоков на любые устройства домашней сети, а также за её пределами на Android устройствах.

Идея создать свой собственный ТВ-сервер пришла из-за того, что в моем телевизоре Sony отсутствует ТВ-тюнер стандарта DVB-T2, а есть только DVB-T. Я мог бы купить обычный ТВ-тюнер за 1000 рублей и подключить его к телевизору, но цифровое ТВ у меня было бы только на одном устройстве, поэтому я решил пойти немного дальше и расширить данный функционал. ТВ-тюнеров пришлось покупать 2-е штуки, т.к. эфирное цифровое ТВ в России состоит из двух мультиплексов и чтобы смотреть ТВ на всех девайсах одновременно для каждого мультиплекса нужно взять отдельный тюнер, т.к. частота мультиплексов разная — для первого она составляет 474МГц, а для второго 658МГц.

Вам понадобится

Шаг 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 :)

Понравилась инструкция? Тогда поделитесь ей со своими друзьями или попробуйте написать свою собственную!

Регистрация на сайте

Оставьте свой отзыв

Вы должны Войти, чтобы оставлять отзывы.