Меню

Как настроить streaming server

Создаем сервер для потокового видео: глава из книги по PHP от нашего разработчика

У нас в Skyeng работают весьма талантливые люди. Вот, например, бэкенд-разработчик Words Сергей Жук написал книгу про событийно-ориентированный PHP на ReactPHP, основанную на публикациях его блога. Книга англоязычная, мы решили перевести одну самодостаточную главу в надежде, что кому-то она сможет пригодиться. Ну и дать скидочную ссылку на всю работу.

В этой главе мы рассмотрим создание элементарного асинхронного сервера для видео-стриминга на ReactPHP Http Component. Это компонент высокого уровня, предоставляющий простой асинхронный интерфейс для обработки входящих соединений и HTTP-запросов.

Для поднятия сервера нам потребуются две вещи:
— инстанс сервера (React\Http\Server) для обработки входящих запросов;
— сокет (React\Socket\Server) для обнаружения входящих соединений.

Для начала давайте сделаем очень простой Hello world сервер, чтобы понять, как все это работает.

Основная логика этого сервера заключена в функции обратного вызова, передающейся конструктору сервера. Обратный вызов осуществляется в ответ на каждый входящий запрос. Он принимает инстанс объекта Request и возвращает объект Response . Конструктор класса Response принимает код ответа, заголовки и тело ответа. В нашем случае в ответ на каждый запрос мы возвращаем одну и ту же статическую строчку Hello world.

Если мы запустим этот скрипт, он будет выполняться бесконечно. Работающий сервер отслеживает входящие запросы. Если мы откроем адрес 127.0.0.1:8000 в нашем браузере, мы увидим строку Hello world. Отлично!

Простой стриминг видео

Давайте теперь попробуем сделать что-нибудь поинтереснее. Конструктор React\Http\Response может принять читаемый поток (инстанс класса ReadableStreamInterface ) в качестве тела ответа, что позволяет нам передавать поток данных непосредственно в тело. Например, мы можем открыть файл bunny.mp4 (его можно скачать с Github) в режиме чтения, создать с ним поток ReadableResourseStream и предоставить этот поток в качестве тела ответа:

Для создания инстанса ReadableResponseStream нам нужен цикл событий, мы должны передать его в замыкание. Кроме того, мы поменяли заголовок Content-Type на video/mp4 , чтобы браузер понимал, что в ответе мы посылаем ему видео.

Заголовок Content-Length объявлять не нужно, поскольку ReactPHP автоматически использует chunked transfer и отправляет соответствующий заголовок Transfer_Encoding: chunked .

Давайте теперь обновим окно браузера и посмотрим потоковое видео:

Супер! Мы сделали стриминговый видео-сервер с помощью нескольких строк кода!

Важно создать инстанс ReadableResourseStream непосредственно в функции обратного вызова сервера. Помните об асинхронности нашего приложения. Если мы создадим поток вне обратного вызова и просто передадим его, никакого стриминга не случится. Почему? Потому что процесс чтения видеофайла и обработка входящих запросов сервера работают асинхронно. Это значит, что пока сервер ждет новые соединения мы также начинаем читать видеофайл.

Чтобы убедиться в этом, мы можем использовать события потока. Каждый раз, когда читаемый поток получает данные из своего источника, он запускает событие data . Мы можем присвоить этому событию обработчик, который будет выдавать сообщение каждый раз, когда мы читаем данные из файла:

Когда интерпретатор доходит до последней строки $loop->run(); , сервер начинает ожидать входящие запросы, и одновременно мы начинаем читать файл.

Поэтому есть вероятность, что к тому моменту, когда на сервер придет первый запрос, мы уже достигнем конца видеофайла, и у нас не будет данных для стриминга. Когда обработчик запроса получит уже закрытый ответный поток, от просто отправит пустое тело ответа, что приведет к пустой странице браузера.

Улучшения

Дальше мы попробуем улучшить наш маленький сервер. Допустим, мы хотим дать пользователю возможность указывать имя файла для стриминга непосредственно в строке запроса. Например, при вводе в адресной строке браузере 127.0.0.1/?video=bunny.mp4 сервер начнет стримить файл bunny.mp4. Хранить файлы для стриминга мы будем в директории media. Теперь нам надо каким-то образом получить параметры из запроса. Объект запроса, который мы получаем в обработчике запроса, содержит метод getQueryParams() , возвращающий массив GET, аналогично глобальной переменной $_GET :

Читайте также:  Как настроить iptv лджи

Теперь, чтобы посмотреть видео bunny.mp4, мы должны зайти на 127.0.0.1:8000?video=bunny.mp4. Сервер проверяет входящий запрос на параметры GET. Если мы находим параметр video , мы считаем, что это название видеофайла, который хочет увидеть пользователь. Затем мы выстраиваем путь к этому файлу, открываем читаемый поток и передаем его в ответе.

Но здесь есть проблемы. Видите их?

— Что если на сервере нет такого файла? Мы должны в этом случае вернуть страницу 404.
— Теперь у нас есть жестко заданное в заголовке значение Content-Type . Нам надо определять его в соответствии с указанным файлом.
— Пользователь может запросить любой файл на сервере. Мы должны ограничить запрос только теми файлами, которые мы готовы ему отдать.

Проверка наличия файла

Прежде чем открыть файл и создать поток, мы должны проверить, существует ли вообще этот файл на сервере. Если нет – возвращаем 404:

Теперь наш сервер не будет падать, если пользователь запросил неверный файл. Мы выдаем правильный ответ:

Определение MIME-типа файла

В PHP есть отличная функция mime_content_type() , возвращающая MIME-тип файла. С ее помощью мы можем определить MIME-тип запрошенного видеофайла и заменить им заданное в заголовке значение Content-Type :

Отлично, мы убрали жестко заданное в заголовке значение Content-Type , теперь оно определяется автоматически в соответствии с запрошенным файлом.

Ограничение на запрос файлов

Осталась проблема с запросом файлов. Пользователь может задать любой файл на сервере в строке запроса. Например, если код нашего сервера находится в server.php и мы укажем такой запрос в адресной строке браузера: 127.0.0.1:8000/?video=../server.php, то в результате получим следующее:


Не очень безопасно… Чтобы это исправить, мы можем использовать функцию basename() , чтобы брать только имя файла из запроса, отрезая путь к файлу, если он был указан:

Теперь тот же запрос выдаст страницу 404. Исправлено!

Рефакторинг

Вообще, наш сервер уже готов, но его основная логика, размещенная в обработчике запроса, выглядит не очень. Разумеется, если вы не собираетесь ее менять или расширять, можно оставить и так, непосредственно в обратном вызове. Но если логика сервера будет меняться, например, вместо простого текста мы захотим строить HTML-страницы, этот обратный вызов будет расти и быстро станет слишком путаным для понимания и поддержки. Давайте сделаем небольшой рефакторинг, вынесем логику в собственный класс VideoStreaming . Чтобы иметь возможность использовать этот класс в качестве вызываемого обработчика запроса, мы должны встроить в него волшебный метод __invoke() . После этого нам будет достаточно просто передать инстанс этого класса в качестве обратного вызова конструктору Server :

Теперь можно строить класс VideoStreaming . Он требует одну зависимость – инстанс цикла событий, который будет встроен через конструктор. Для начала можно просто скопировать код из обратного вызова запроса в метод __invoke() , а затем заняться его рефакторингом:

Далее мы будем рефакторить метод __invoke() . Давайте разберемся, что тут происходит:
1. Мы парсим строку запроса и определяем, какой файл нужен пользователю.
2. Создаем поток из этого файла и отправляем его в качестве ответа.

Читайте также:  Как правильно настроить видеорегистратор зеркало dexp

Получается, мы можем здесь выделить два метода:

Первый, getFilePath() , очень прост. Мы получаем параметры запроса с помощью метода $request->getQueryParams() . Если в них нет ключа file , мы просто возвращаем простую строку, показывающую, что пользователь открыл сервер без параметров GET. В этом случае мы можем показать статичную страницу или что-то в этом духе. Здесь мы возвращаем простое текстовое сообщение Video streaming server. Если пользователь указал file в запросе GET, мы создаем путь к этому файлу и возвращаем его:

Метод makeResponseFromFile() также очень прост. Если по указанному пути нет файла, мы сразу же возвращаем ошибку 404. В противном случае мы открываем запрошенный файл, создаем читаемый поток и возвращаем его в теле ответа:

Вот код класса VideoStreaming целиком:

Разумеется, вместо простого обратного вызова обработчика запроса у нас теперь в три раза больше кода, но если этот код будет меняться в будущем, нам будет значительно проще проводить эти изменения и поддерживать наше приложение.

Примеры из этой главы можно найти на GitHub.

У Сергея также есть полезный регулярно обновляемый англоязычный блог.

Наконец, напоминаем, что мы всегда находимся в поиске талантливых разработчиков! Приходите, у нас весело.

Источник



Установка и настройка Wowza Streaming Engine сервера. Часть 1

В сегодняшней заметке мы более подробно разберем, то как устанавливать и настраивать Wowza сервер. Ссылка на данную статью также будет размещена в моем справочнике по видеотрансляциям.

Бесплатный курс: «Медиа-сервер Wowza Streaming Engine. Быстрое погружение»

Wowza медиасервер

Wowza сервер разрабатывается компанией Wowza Media Systems. Сервер предназначен для организации живого потокового вещания и доставки видео по запросу. Подробнее о нем можно почитать в заметке по следующей ссылке.

Установка Wowza Streaming Engine

На сайте компании можно скачать установочные пакеты для различных операционных систем (Рис. 1). Там же приведены инструкции по установке.

Запуск программы установки в ОС Ubuntu выглядит следующим образом:

$ chmod +x WowzaStreamingEngine-4.1.0.deb.bin
$ sudo ./WowzaStreamingEngine-4.1.0.deb.bin

В процессе установки программа предложит согласиться с лицензионным соглашением, ввести логин с паролем для администрирования медиасервера и потребует лицензионный ключ (Рис. 2).

По окончании установки программа предложит запускать медиасервер при загрузке системы и выведет инструкцию по запуску в случае отказа. После установки медиасервер автоматически запускается.

Панель администрирования сервера можно открыть по адресу http://[ip-сервера]:8088 (Рис. 3)

Получение расширенных прав администратора

Учетная запись администратора, созданная при установке медиасервера, позволяет изменять ограниченное число настроек сервера. Чтобы получить доступ ко всем настройкам необходимо изменить тип учетной записи на расширенный тип.

Для этого необходимо перейти на вкладку Server и выбрать пункт Users. Далее нажать на иконку Edit напротив учетной записи, которую собираемся редактировать (Рис. 4).

Отмечаем опцию Allow access to advanced properties and features (Разрешить доступ к расширенным настройкам и возможностям) и нажимаем Save (Рис. 5).

Создание учетной записи публикатора

Далее необходимо создать учетную запись издателя (публикатора). Она необходима для аутентификации потока, транслируемого на сервер. Во вкладке Server выбираем пункт Publishers и нажмите Add Publisher (Рис. 6).

Вводим имя учетной записи, задаем пароль и нажимаем кнопку Add (Рис. 7).

Настройка приложения для получения входящих потоков

Приложение это набор настроек. В общем случае удобнее настроить одно из предустановленных и настроенных по умолчанию приложений. Перейдем на вкладку Applications. Выберем приложение live в списке LIVE APPLICATIONS (Рис. 8).

Читайте также:  Как настроить телефон чтобы не было занято

Далее настроим параметры аутентификации потоков. Выбираем пункт Incoming Security и нажимаем Edit (Рис. 9).

Отметим опцию Require password authentication (Необходима аутентификация паролем) в RTMP /RTSP Publishing и нажмем Save (Рис. 10). Теперь медиасервер будет принимать только видеопотоки подписанные учетной записью издателя (публикатора).

Далее перейдем к пункту Outgoing security (Рис. 11).

Чтобы позволить медиасерверу отдавать потоки без шифрования снимаем галочку с опции Require secure RTMP connection, если она стоит (Рис 12).

Теперь сервер готов принимать входящие потоки по протоколу RTMP. Потоки следует отправлять на адрес rtmp://[ip-сервера]:1935/live. Активные потоки можно посмотреть в Incoming Streams (Рис. 13).

На этом я заканчиваю сегодняшнюю статью. В одной из следующих статей будет представлена информация по тому, как настраивать адаптивное потоковое вещание на Wowza сервере.

Если у вас появились какие-то вопросы по Wowza серверу, пишите. Если вам нужно что-то настроить или получить консультацию по медиа серверам и системам, также можете обращаться ко мне и нашей команде. Также разную полезную информацию на данную тему вы можете найти в нашем Справочнике по видеотрансляциям.

Заключение

Эта статья была написана, отредактирована и опубликована совместно c моими коллегами и специалистами Евгением Петровым, Пестовым Игорем и Танана Михаилом.

Приглашаю подписаться на новости моей публичной страницы ВКонтакте, ее адрес http://vk.com/itmultimedia . Буду рад видеть Вас в своих подписчиках!

Всего хорошего!

Источник

Hikvision

My Account

Поиск

Последние записи

Последние комментарии

Категории

Как настроить IVMS4200
Stream Media Server

Для начала стоит разобраться что такое IVMS4200 Stream Media Server и для чего он нужен.

На устройствах Hikvision существует естественный лимит одновременных подключений (от 6 до 128 одновременных подключений, в зависимости от устройства). В него входят подключения к основному и дополнительному потокам, а также, например, просмотр записей с камер и регистратора. Stream Media Server помогает увеличить количество одновременных подключений. Работает он следующим образом.

На один из компьютеров сети, назовем его Сервером, устанавливается IVMS 4200 Stream Media Server (можно выбрать галочкой при установке IVMS 4200). Этот компьютер принимает поток от выбранных камер, а при обращении к нему – передаёт поток другим компьютерам.

От теории переходим к практике. Будем настраивать IVMS4200 Stream Media Server .

На Сервер установите IVMS 4200 Stream Media Server. После запустите программу (до IVMS 4200).

В трее, рядом с часами на панели “Пуск”, появится аналогичный значок.

Следующие действия нужно выполнить и на клиентских компьютерах:

Запустить программу IVMS 4200.

Зайти во вкладку “Управление устройствами”.

  • Нажать “Добавить новый тип устройства”.
  • В появившемся окне отметьте галочкой Stream Media Server.

    В открывшейся вкладке Stream Media Service нажмите кнопку “Добавить”.

    Заполните поля как на верхнем скриншоте. В поле IP-адрес отметьте IP-адрес Сервера (компьютера, на котором установлена программа IVMS4200 Stream Media Server). В поле “Порт” отметьте 554, если при установке ничего не меняли, либо порт, который был изменен при установке.

    Нажмите кнопку “Добавить”.

    После этого нажмите кнопку “Конфигурация” и отметьте галочками те камеры, с которых хотите получать поток не напрямую, а через Stream Media Server.

    Внимание! Для корректной работы Stream Media Server камеры нужно добавить в список устройств (верные адрес/имя пользователя/пароль) на компьютере с установленным Stream Media Server и на компьютерах-клиентах. Кроме того, при отключении Сервера или IVMS4200 SMS на нём, поток на клиентских компьютерах пропадёт.

    Источник