Как стать автором
Обновить

Как я создавал собственный сервер трансляции видео на базе домашнего ПК

Время на прочтение 10 мин
Количество просмотров 22K

Сразу хочу отметить, что в Интернете много статей на похожую тему, но каждая статья имеет те или иные нюансы. Здесь я напишу про свой личный опыт.

История примерно такая. В нашем городе имеется своё местное телевидение. Оно транслируется в сети кабельного телевидения в аналоговом и цифровом (DVB-C) виде. Точнее, оно транслируется в определённое время по полчаса в день на телеканале-партнёре (в нашем случае – телеканал «Продвижение»). Кабельное телевидение доступно не каждому жителю. В основном оно протянуто в многоквартирных домах, каковым мой дом не является. А до сентября прошлого года телеканал местного ТВ вещали в ДМВ диапазоне в аналоговом виде. Именно этот и только этот телеканал я и смотрел, пока не прекратили вещание. Также имеется канал местного телевидения на ютубе, но там информация публикуется только на следующий день после премьеры. И то, информация не полная, только видеосюжеты. Мне пришла такая идея: сделать каким-то образом передачу местного телеканала с кабельного телевидения к себе домой через Интернет. У многих моих хороших знакомых в квартире есть кабельное телевидение. На базе одного из них я и решил осуществить задуманное.

Компьютер, на котором я всё собрался строить, был с ОС Windows 7 x64 и конфигурацией, как на рис. 1.

Рис. 1. Краткая конфигурация компьютера.
Рис. 1. Краткая конфигурация компьютера.

Платы ТВ-тюнера и видеозахвата, которыми я располагал, уже не поддерживали данную операционную систему на уровне драйверов. А ставить Windows XP было невозможно по другим причинам. Но у меня валялся USB «свисток» для оцифровки видеокассет. Это своего рода кастрированное устройство видеозахвата, как я его называю (рис. 2). Однако для моих нужд такое устройство вполне сойдёт, и оно отлично работает в Windows 7. На нём есть вход аудио стерео, композитный и S-Video вход видео.

Рис. 2. USB устройство видеозахвата.
Рис. 2. USB устройство видеозахвата.

Предполагалось, что к нему я подключу внешний ТВ-тюнер, а его в свою очередь подключу к сети кабельного телевидения. В роли ТВ-тюнера буду использовать полноценный видеомагнитофон или ТВ-приставку. К устройству видеозахвата в комплекте прилагается программа для осуществления видеозаписи, в том числе и по расписанию. Изначально я собирался воспользоваться именно видеозаписью по расписанию, чтобы в автоматическом режиме в определённое время записывать видео с необходимого телеканала, когда транслируется местное телевидение. При этом записанные файлы сразу же передавать к себе на FTP-сервер (к примеру) также в автоматическом режиме, или иметь к ним удалённый доступ. Но при экспериментах мне не понравилось качество работы данной программы по оцифровке. Но это не самое печальное. Ещё некорректно работал аудиовход, который находится на борту устройства. Оно в диспетчере устройств определяется как «OEM Capture», но данное устройство является устройством видео. То есть, оно не числится в системе как устройство ввода аудио. А аудиовход на нём работает, как подмешивание звукового сигнала в систему. Именно это мне и не понравилось. В программе для оцифровки имеется возможность принудительно указать звуковую карту для захвата звука, но эта опция оказалась некорректно работающая. В целом мне не понравилась эта программа, и я начал искать другие пути решения.

Тут же я вспомнил про VLC плеер, в котором есть возможность открывать не только файлы, но и устройства видеозахвата DirectShow (рис. 3). Ещё я помнил, что там имеется возможность стримить видео, т.е., делать трансляцию видео с данного устройства в компьютерную сеть. Удивительно, но мой «свисток» открылся в VLC, однако не без проблем. Практически у любого устройства видеозахвата на уровне драйверов имеется конфигуратор в виде отдельного окошка. Там настраиваются аппаратные параметры устройства и базовые параметры видеозахвата: частота кадров, источник входа видео, яркость и контрастность изображения и т.д. Это окно отдельно вызывается при открытии устройства, если поставить галочку «Настройка устройства» в расширенных параметрах (рис. 4). Именно там и нужно было правильно настроить моё устройство видеозахвата. Данное окно я не стал выставлять в виде рисунка, оно может быть индивидуально для каждого устройства.

Рис. 3. Диалог открытия устройства захвата в VLC.
Рис. 3. Диалог открытия устройства захвата в VLC.
Рис. 4. Настройка расширенных параметров.
Рис. 4. Настройка расширенных параметров.

Кроме возможности стрима VLC также умеет записывать видео в файл. Само собой, как известно, VLC поддерживает командную строку. Можно было организовать и расписание записи с помощью системного планировщика, вызывая bat-файл по таймеру с нужной командой для VLC. Но на данном этапе меня заинтересовала исключительно функция стрима. При данной функции VLC выступает в роли сервера, который слушает соединения по указанному в настройках порту. Также в настройках указываются и другие параметры: мультиплексоры, фильтры, кодеки и т.д. Сильно глубоко я в это дело не вникал. После долгих танцев с бубном и разных экспериментов мне удалось настроить только вывод в HTTP (рис. 5) с перекодированием в MPEG-2 (рис. 6). Более предпочтительный формат H.264 не заработал.

Рис. 5. Настройка стрима в VLC - выбор модуля.
Рис. 5. Настройка стрима в VLC - выбор модуля.
Рис. 6. Настройка стрима в VLC - выбор кодека.
Рис. 6. Настройка стрима в VLC - выбор кодека.

На роутере, где установлен данный компьютер, настроена функция DDNS, и провайдер даёт прозрачный IP-адрес. Также там осуществлён «проброс» соответствующего порта для данного компьютера. Таким образом, я подключаюсь из дома к серверу по доменному имени и смотрю трансляцию видео с устройства видеозахвата. Битрейт видео выставлен небольшой – 500 кбит/с. При более высоком битрейте соединение становится нестабильным и обрывается. Качество видео на таком низком битрейте в MPEG-2 оставляет желать лучшего. Изображение сильно рассыпается по «клеточкам» на быстрых сценах, чего не было бы с кодеком H.264 при том же низком битрейте.

Я продолжил искать другие пути решения. Тут я вспомнил про сервис «YouTube», где можно не только выкладывать видео, но и проводить прямые эфиры (стримы). Тем более, когда-то давно, лет 10 назад, я пробовал этим заниматься, используя плату видеозахвата вместо веб-камеры. С тех пор в техническом и программном оснащении ютуба много чего изменилось. Как выяснилось, стримы удобнее всего проводить с помощью отдельных специальных программ, которые называются стримерами. Стримеров существует несколько. Один из самых популярных – OBS Studio (рис. 7). Стример оформляет и подготавливает видео и аудио контент, основанный на множестве видеоисточников, различных эффектах и шаблонах. Затем он кодирует (сжимает) подготовленный поток в H.264 с указанными в настройках параметрами, после чего отправляет данный стрим на ютуб-канал пользователя. В качестве источников можно указать что хочешь: текущий экран, видеофайл, веб-камера, устройство видеозахвата, URL-поток стороннего сервера и т.д.

Рис. 7. Окно программы-стримера OBS Studio.
Рис. 7. Окно программы-стримера OBS Studio.

Моё устройство видеозахвата успешно подхватилось в OBS Studio. На ютуб-канал стрим может отправляться двумя способами: с помощью самой программы, где нужно авторизоваться на ютубе, и с помощью URL-адреса и ключа потока, которые генерирует ютуб при создании стрима и которые нужно вставить в параметры стримера. Я выбрал первый способ. Но и в этом случае я наткнулся ещё на одну лажу – политику ютуба. Дело в том, что ютуб не пропускает мой стрим с телеканала, сообщая о каких-то там нарушениях. А ещё ютуб при стриме некорректно обрабатывает видеопоток с пропорциями экрана 4:3. Именно в таком формате работает наше местное телевидение. И если открыть такой стрим с ютуба на мониторе 4:3 или 5:4 во весь экран, то не будет заполнения экрана по ширине, что крайне неприятно. Ютуб всё равно воспринимает видео, как 16:9. Сверху, слева, снизу и справа моё видео окружается чёрным обрамлением. При этом в настройках стримера пропорции видео указаны, какие нужны. Тем самым и эта технология отпала. Хотя, даже если бы она работала, она бы не соответствовала названию данной статьи. А так, в целом, OBS Studio отлично справляется с формированием качественного потока видео, даже на 500 кбит/сек, поэтому идею с OBS Studio я не хотел вычёркивать.

Я начал упорно искать в Интернете информацию, как сделать свой собственный независимый «сервер ютуб». Мне попалось очень много одинаковых статей на тему «Как размножить свой стрим на несколько соцсетей». Опишу кратко, в чём суть. Хотя, многие читатели это знают, как дважды два. Допустим, имеется стример OBS Studio. Данный стример умеет передавать поток только на один URL-адрес, который указан в настройках. Допустим, это ютуб. Если требуется транслировать видео одновременно, к примеру, не только на ютуб, но и в «Одноклассники», то требуется специальный программный инструмент по типу размножителя потока. В качестве такого инструмента используется программа «Nginx». Это простой и достаточно мощный универсальный сервер, который можно настроить в роли почтового сервера, веб-сервера, прокси-сервера и т.д. Про него можно очень много писать и рассказывать. В рассматриваемом примере программа конфигурируется таким образом, что на неё направляется видеопоток от стримера, и она, в свою очередь, передаёт этот поток на указанные в её настройках URL-адреса. То есть, с одной стороны сервер принимает соединения по определённому порту. Туда подключается стример. С другой стороны – сервер передаёт видеопоток от стримера в нужные сервисы видеотрансляции. В настройках стримера при этом в поле URL-адреса отправки стрима указывается не адрес сервиса с ключом трансляции, а адрес сервера Nginx («rtmp://localhost/live», если Nginx установлен на том же компьютере). При этом ветка «rtmp» в файле конфигурации Nginx прописывается так:

rtmp {
	server {
		listen 1935;
		chunk_size 4096;
		application live {
				live on;
				record off;
				push rtmp://live-ams.twitch.tv/app/STREAMKEY; #адрес потока №1
				push rtmp://a.rtmp.youtube.com/live2/STREAMKEY; #адрес потока №2
		}
	}
}

В данном примере, как видно, стрим размножается на сервисы ютуб и твич. Это был пример использования Nginx в качестве размножителя потока. Но с помощью него можно создать и свой сервер видеотрансляции. Немного подумав и почитав дополнительную информацию, я сконфигурировал Nginx следующим образом:

rtmp {
	server {
		listen 1935;
		chunk_size 4096;
		application live {
			live on;
			record off;
		}
	}
}

То есть, я убрал команды «push», благодаря которым в прошлом примере осуществлялся стрим на сервисы. В итоге Nginx стал в роли связующего звена: с одной стороны Nginx «слушает» входящие соединения от стримера, а с другой – соединения от зрителей трансляции. В настройках стримера адрес вывода потока прописан такой же, как и в примере, только вместо «localhost» я написал «127.0.0.1», указав принудительно порт 1935, как в конфигурации Nginx (рис. 8). После слэша написано слово «live» – такое же слово, какое написано в конфигурации Nginx после слова «application. В поле «Ключ потока» можно прописать любое слово. Его нужно будет добавить пользователю в URL-адрес при подключении к серверу. У меня прописано слово «stream». Таким образом, чтобы подключиться к серверу видеотрансляции, например, с помощью плеера VLC на этом же ПК, нужно открыть URL «rtmp://localhost/live/stream». А если нужно подключиться с другого устройства в Интернете, то нужно ввести «rtmp://myaddress/live/stream», где myaddress – доменное имя, привязанное к адресу роутера в Интернете (об этом я писал в самом начале). Соответствующий порт на роутере должен быть проброшен.

Рис. 8. Настройка OBS Studio под NGINX.
Рис. 8. Настройка OBS Studio под NGINX.

Это окончательное решение, которое полностью удовлетворило мои потребности. Стрим видео из OBS Studio на Nginx ведётся постоянно и непрерывно. Загрузка процессора при стриме составляет около 30%. Качество видео вполне удовлетворительное, проблем с согласованием соотношений сторон экрана также не возникает.

К устройству видеозахвата подключена приставка DVB-C через видеовыход. Конечно же, это не совершенно, но зато изображение качественнее, чем с аналогового ТВ-тюнера. Гораздо больший смысл и правильный вариант – взять в качестве источника видео плату DVB-C, но её ещё нужно где-то найти. Потом её нужно привязать в OBS Studio, настроив на нужный ТВ канал. Я пробовал настраивать китайский USB DVB-C/T/T2 свисток (из которого делают RTL-SDR), но он отказался уверенно принимать сигнал кабельного телевидения. Скорее, он больше уверенно не принимал, чем неуверенно принимал.

В качестве бонуса, кроме организации сервера видеотрансляции, я настроил автоматическую запись телепрограмм по расписанию. Это предусмотрено на тот случай, если у меня по каким-то причинам не получается вовремя включить прямой эфир трансляции, и есть возможность посмотреть её в записи. Работает это следующим образом. В роли видеорекордера выступает всё тот же VLC, установленный на том же компьютере, где Nginx и OBS Studio. VLC подключается к серверу, как к URL-потоку «rtmp://localhost/live/stream». При этом VLC не воспроизводит видео на экран, а записывает его в файл без перекодировки. В имя файла входит текущая дата и время, и заголовок «LIVNY». Всё это достигается в один клик с помощью вызова специального bat-файла, который я заранее запрограммировал:

@echo off
SET T=%TIME%
SET D=%DATE%
SET HH=%T:~0,2%
SET MM=%T:~3,2%
SET SS=%T:~6,2%
SET YY=%D:~6,4%
SET MN=%D:~3,2%
SET DD=%D:~0,2%
"C:\Program Files\VideoLAN\VLC\vlc.exe" --playlist-autostart rtmp://localhost/live/stream :network-caching=1000 :sout=file/ts:D:\\Capture\\LIVNY_%YY%%MN%%DD%_%HH%%MM%%SS%.ts --stop-time=1815 vlc://quit

Нужно дать короткое пояснение по написанным командам. Это элементы программирования в командной строке Windows. В переменную T извлекается текущее время в формате текстовой строки. Аналогично – в D извлекается текущая дата. В переменную HH извлекаются часы из переменной времени T, как диапазон символов «от 0 длиной 2» текстовой строки T. В переменную MM – минуты, как диапазон символов «от 3 длиной 2». И так далее. Аналогия такой функции в Excel (если кто знает) – ПСТР(текст; начальная позиция; количество знаков). Затем идёт команда для VLC, где в аргументе для sout указан файл, тип – ts, и его полное имя, которое собирается из вышеуказанных переменных даты и времени. Число «1815» – длительность записи в секундах. То есть, я осуществляю запись видео продолжительностью 30 мин. 15 сек. Данный bat-файл я вызываю с помощью стандартного планировщика заданий Windows (рис. 9). Для удалённого просмотра файлов я использую функцию сетевого окружения Windows, подключаясь к сети по VPN, что установлен на базе роутера.

Рис. 9. Вызов VLC на запись видео в планировщике Windows.
Рис. 9. Вызов VLC на запись видео в планировщике Windows.

Кроме этого есть ещё дополнительные примочки. У себя дома на одном из ПК можно включить сервер ретрансляции для локальной сети. Он реализован на базе всё того же VLC. Это сервер трансляции видео, которым является видеопоток по URL-адресу удалённого сервера видеотрансляции «rtmp://myaddress/live/stream». Данный URL указывается в качестве источника стрима. Вывод осуществляется без перекодировки потока, но в HTTP. Это всё нужно для того, чтобы распространить свою трансляцию на нескольких устройствах в локальной сети, не загружая при этом Интернет-канал одним и тем же дублирующим трафиком. При этом я подключаюсь к стриму по URL «http://192.168.0.3:8080», где 192.168.0.3 – адрес сервера ретрансляции в локальной сети, а 8080 – порт, указанный в настройках ретрансляции. Хотя, такие случаи бывают крайне редко.

И последний момент. На всех современных смарт-телевизорах (порой даже и не только смарт) имеется востренный клиент DLNA. Это специальный функционал, позволяющий смотреть на ТВ медиаконтент из локальной сети, к которой подключен телевизор. Данный медиаконтент (видео, фото, аудио) подготавливается на том или ином устройстве (смартфон или компьютер) с установленным DLNA-сервером. Своего рода, это аналогия общей папки на компьютере в локальной сети, но только для телевизора. Существует множество программ-серверов DLNA. Но одна из них – Serviio – позволяет публиковать через DLNA, кроме файлов, URL-видеопоток (рис. 10). Таким образом, имеется возможность смотреть любой стрим (в частности, свой собственный) на ТВ через DLNA.

Рис. 10. DLNA-сервер Serviio с возможностью вывода видеопотока.
Рис. 10. DLNA-сервер Serviio с возможностью вывода видеопотока.

Теги:
Хабы:
+20
Комментарии 10
Комментарии Комментарии 10

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн