Привет, Хабр. В этой статье я хочу поделиться своим опытом создания приложения на фреймворке Laravel по трансляции видеоконтента. Итак начнём. Проект опубликован как свободное ПО Сделать сервис, совместимый с бизнес-моделью SaaS , принимающий данные по протоколу RTMP от разных поставщиков контента и раздающий этот контент по HLS конечным пользователям за плату или бесплатно, т.е. реализовать Live-трансляции. Будем использовать свободное программное обеспечение. Для работы с RTMP и HLS мы будем использовать nginx с nginx-rtmp-module. Для выполнение веб-приложения мы будем использовать apache2, php, базу данных MariaDB. В качестве фреймворка Laravel с компонентами LiveWire для динамического обновления данных и для построения html страниц шаблоны Blade. Для обработки записанных трансляций будем использовать FFMPEG. Всё это на сервере Ubuntu 20.04 LTS. Создали проект Laravel 8. Создаём миграции для баз данных. У нас будут пользователи, организации (поставщики контента), посты (то есть записи о будущих, текущих и прошедших трансляциях) и так далее. Таблица Users: Таблица Orgs: Таблица постов: Модель пользователя: Модель поста: По сути вся логика приложения пишется в контроллерах. С пользователями и другими моделями достаточно всё тривиально. Рассмотрим контроллер постов и контроллер взаиморасчетов между организациями и пользователями. Контроллер постов: Этот контроллер у нас взаимодействует и конечным пользователем и сервером nginx. Маршруты к этому контроллеру для пользователя мы напишем в web.php: А для сервера в файле api.php: Логика такая: пользователь создаёт пост: пишет название, дата и время начала и конца, прикладывает картинку, при сохранение модель создаёт уникальные stream_name и stream_token. stream_name видят все, а stream_token только администраторы и автор поста. Запись внесена в базу данных. Затем автор запускает приложение для трансляции контента на сервер, например OBS. Указывает rtmp адрес сервера и запускает. Данные принимает сервер nginx и отправляет запрос на приложение, как это указано в его настройках: То есть событие on_publish в сервере nginx вызывает метод rtmp_on у контроллера поста. Веб-приложение проверяет stream_name и stream_token т.е. есть ли вообще такой пост и совпадает ли токен, если да, то ответ для сервера HTTP 204, и сервер продолжает принимать данные RTMP, а если нет, то HTTP 403, сервер отказывает в приёме данных, в программе OBS выйдет ошибка I/O error. rtmp_off - вносит меняет статус поста на "трансляция завершена". rtmp_update - обновляет сведения о трансляции. Также контроллер поста проверяет надо ли записывать трансляцию, причём пользователь может в реальном времени начинать и останавливать запись. Для таких действий мы будем использовать очередь Laravel для того, чтобы они выполнялись в одном потоке. Создадим службу для очередей Laravel: для приёма команд от службы очередей laravel на стороне nginx создадим виртуальный хост на 82 порту: Теперь можно вовремя трансляции управлять поведением записи, а также кикать клиентов-вещателей. Задание на старт записи: Теперь про контроллер взаиморасчётов: У нас по каждому пользователю по каждой организации ведется отдельный лицевой счёт взаиморасчётов. Самого лицевого счёта как бы нет, это лишь состояние отношений между организацией и пользователем. Это полезно когда мы с юридической точки зрения не хотим быть платежным агентом и все платежи между клиентами и организациями проходят на прямую. Так же добавим метод оплаты в пользу организации по реквизитам с формированием квитанции в PDF с QR-кодом. За это отвечает функция getkvit. Не составит труда добавить и другие методы оплаты. Не буду вставлять коды Blade шаблонов, иначе статья станет слишком длинной. Проект опубликован на Github https://github.com/deyen01/dlvp как свободное программное обеспечение.  Laravel backend