Сразу хочу отметить, что в Интернете много статей на похожую тему, но каждая статья имеет те или иные нюансы. Здесь я напишу про свой личный опыт.
История примерно такая. В нашем городе имеется своё местное телевидение. Оно транслируется в сети кабельного телевидения в аналоговом и цифровом (DVB-C) виде. Точнее, оно транслируется в определённое время по полчаса в день на телеканале-партнёре (в нашем случае – телеканал «Продвижение»). Кабельное телевидение доступно не каждому жителю. В основном оно протянуто в многоквартирных домах, каковым мой дом не является. А до сентября прошлого года телеканал местного ТВ вещали в ДМВ диапазоне в аналоговом виде. Именно этот и только этот телеканал я и смотрел, пока не прекратили вещание. Также имеется канал местного телевидения на ютубе, но там информация публикуется только на следующий день после премьеры. И то, информация не полная, только видеосюжеты. Мне пришла такая идея: сделать каким-то образом передачу местного телеканала с кабельного телевидения к себе домой через Интернет. У многих моих хороших знакомых в квартире есть кабельное телевидение. На базе одного из них я и решил осуществить задуманное.
Компьютер, на котором я всё собрался строить, был с ОС Windows 7 x64 и конфигурацией, как на рис. 1.
Платы ТВ-тюнера и видеозахвата, которыми я располагал, уже не поддерживали данную операционную систему на уровне драйверов. А ставить Windows XP было невозможно по другим причинам. Но у меня валялся USB «свисток» для оцифровки видеокассет. Это своего рода кастрированное устройство видеозахвата, как я его называю (рис. 2). Однако для моих нужд такое устройство вполне сойдёт, и оно отлично работает в Windows 7. На нём есть вход аудио стерео, композитный и S-Video вход видео.
Предполагалось, что к нему я подключу внешний ТВ-тюнер, а его в свою очередь подключу к сети кабельного телевидения. В роли ТВ-тюнера буду использовать полноценный видеомагнитофон или ТВ-приставку. К устройству видеозахвата в комплекте прилагается программа для осуществления видеозаписи, в том числе и по расписанию. Изначально я собирался воспользоваться именно видеозаписью по расписанию, чтобы в автоматическом режиме в определённое время записывать видео с необходимого телеканала, когда транслируется местное телевидение. При этом записанные файлы сразу же передавать к себе на FTP-сервер (к примеру) также в автоматическом режиме, или иметь к ним удалённый доступ. Но при экспериментах мне не понравилось качество работы данной программы по оцифровке. Но это не самое печальное. Ещё некорректно работал аудиовход, который находится на борту устройства. Оно в диспетчере устройств определяется как «OEM Capture», но данное устройство является устройством видео. То есть, оно не числится в системе как устройство ввода аудио. А аудиовход на нём работает, как подмешивание звукового сигнала в систему. Именно это мне и не понравилось. В программе для оцифровки имеется возможность принудительно указать звуковую карту для захвата звука, но эта опция оказалась некорректно работающая. В целом мне не понравилась эта программа, и я начал искать другие пути решения.
Тут же я вспомнил про VLC плеер, в котором есть возможность открывать не только файлы, но и устройства видеозахвата DirectShow (рис. 3). Ещё я помнил, что там имеется возможность стримить видео, т.е., делать трансляцию видео с данного устройства в компьютерную сеть. Удивительно, но мой «свисток» открылся в VLC, однако не без проблем. Практически у любого устройства видеозахвата на уровне драйверов имеется конфигуратор в виде отдельного окошка. Там настраиваются аппаратные параметры устройства и базовые параметры видеозахвата: частота кадров, источник входа видео, яркость и контрастность изображения и т.д. Это окно отдельно вызывается при открытии устройства, если поставить галочку «Настройка устройства» в расширенных параметрах (рис. 4). Именно там и нужно было правильно настроить моё устройство видеозахвата. Данное окно я не стал выставлять в виде рисунка, оно может быть индивидуально для каждого устройства.
Кроме возможности стрима VLC также умеет записывать видео в файл. Само собой, как известно, VLC поддерживает командную строку. Можно было организовать и расписание записи с помощью системного планировщика, вызывая bat-файл по таймеру с нужной командой для VLC. Но на данном этапе меня заинтересовала исключительно функция стрима. При данной функции VLC выступает в роли сервера, который слушает соединения по указанному в настройках порту. Также в настройках указываются и другие параметры: мультиплексоры, фильтры, кодеки и т.д. Сильно глубоко я в это дело не вникал. После долгих танцев с бубном и разных экспериментов мне удалось настроить только вывод в HTTP (рис. 5) с перекодированием в MPEG-2 (рис. 6). Более предпочтительный формат H.264 не заработал.
На роутере, где установлен данный компьютер, настроена функция DDNS, и провайдер даёт прозрачный IP-адрес. Также там осуществлён «проброс» соответствующего порта для данного компьютера. Таким образом, я подключаюсь из дома к серверу по доменному имени и смотрю трансляцию видео с устройства видеозахвата. Битрейт видео выставлен небольшой – 500 кбит/с. При более высоком битрейте соединение становится нестабильным и обрывается. Качество видео на таком низком битрейте в MPEG-2 оставляет желать лучшего. Изображение сильно рассыпается по «клеточкам» на быстрых сценах, чего не было бы с кодеком H.264 при том же низком битрейте.
Я продолжил искать другие пути решения. Тут я вспомнил про сервис «YouTube», где можно не только выкладывать видео, но и проводить прямые эфиры (стримы). Тем более, когда-то давно, лет 10 назад, я пробовал этим заниматься, используя плату видеозахвата вместо веб-камеры. С тех пор в техническом и программном оснащении ютуба много чего изменилось. Как выяснилось, стримы удобнее всего проводить с помощью отдельных специальных программ, которые называются стримерами. Стримеров существует несколько. Один из самых популярных – OBS Studio (рис. 7). Стример оформляет и подготавливает видео и аудио контент, основанный на множестве видеоисточников, различных эффектах и шаблонах. Затем он кодирует (сжимает) подготовленный поток в H.264 с указанными в настройках параметрами, после чего отправляет данный стрим на ютуб-канал пользователя. В качестве источников можно указать что хочешь: текущий экран, видеофайл, веб-камера, устройство видеозахвата, URL-поток стороннего сервера и т.д.
Моё устройство видеозахвата успешно подхватилось в 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 – доменное имя, привязанное к адресу роутера в Интернете (об этом я писал в самом начале). Соответствующий порт на роутере должен быть проброшен.
Это окончательное решение, которое полностью удовлетворило мои потребности. Стрим видео из 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, что установлен на базе роутера.
Кроме этого есть ещё дополнительные примочки. У себя дома на одном из ПК можно включить сервер ретрансляции для локальной сети. Он реализован на базе всё того же 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.