Я пытаюсь создать небольшую систему, которая будет обслуживать списки воспроизведения HLS (m3u8), которые будут содержать несколько сегментов.
Сегменты будут загружены и отправлены из PHP. Например, сегменты будут выглядеть так:
segment.php?stream=1&username=X&password=X&file=01.ts
segment.php?stream=1&username=X&password=X&file=02.ts
Теперь, я уже сделал эту систему и работает нормально, НО у меня действительно много проблем, когда дело доходит до ограничения соединений. В общем, я хочу ограничить одного клиента (uname / pass), чтобы он мог открывать только 1 поток за раз.
Допустим, у нас есть 2 потока в следующем формате
1.m3u8
2.m3u8
И я называю их так (PHP Url Rewrite to php file):
http://site/1.m3u8?username=X&password=X
http://site/2.m3u8?username=X&password=X
И у каждого из них есть вышеупомянутые сегменты, которые я объяснил наверху.
Как я могу ограничить каждого клиента, чтобы он мог открыть ТОЛЬКО 1 соединение одновременно но в то же время Дайте ему переключиться на 2-й канал (закрыть первое), без проблем?
Я потратил несколько дней, чтобы понять это, и всегда что-то не работает хорошо.
Мне не нужно, чтобы вы предоставили мне код, просто какую-то идею или план, который мог бы мне помочь.
Также я использую NGINX, если это имеет значение.
Трудно определить ТОЧНО, чего вы пытаетесь достичь, учитывая предоставленную вами информацию, но вот идея.
Используйте вашу базу данных. Вам понадобится как минимум 2 таблицы.
Таблица потоков
В таблице потоков хранится каждый поток с указанием пути, статуса и идентификатора пользователя.
+----+---------+----------------+--------+
| id | user_id | stream_path | status |
+----+---------+----------------+--------+
| 1 | 1 | path/to/stream | 0 |
+--------------+----------------+--------+
| 2 | 1 | path/to/stream | 1 |
+----|---------+----------------+--------+
Когда пользователь открывает первый поток, установите для него статус активный (1), а для второго — неактивный (0), а когда пользователь откроет второй поток, установите для этого потока статус активный (1), а для предыдущего потока — неактивный (0). ,
На стороне клиента проверьте, активен ли используемый ими поток, и уничтожьте поток, если он неактивен.
Также из соображений безопасности вы не хотите передавать информацию пользователя в потоке, и в этом подходе вам не нужно. База данных будет аутентифицировать пользователя, и оттуда вы можете запросить, к каким потокам у них есть доступ и их статус. Если вам нужно больше динамики для ваших запросов, вы можете разбить значения по нескольким таблицам, таким как таблица потоков, user_streams, stream_status и т. Д., Но одна таблица подойдет для потоков, если нет.
Если вы хотите предоставить более подробную информацию о том, каков ваш точный сценарий, я был бы рад обновить мой ответ.
Других решений пока нет …