Создаём ТВ-сервер дома на 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

Распаковываем архив:

unxz -v 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 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 :)

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

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

Дайте свою оценку данной инструкции


Поделитесь этой инструкцией со своими друзьями

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

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