Прямая трансляция с помощью nginx-rtmp-module - PullRequest
0 голосов
/ 29 марта 2019

Доброе время суток,

Я выбрал nginx-rtmp-module для службы потокового вещания, которую я делаю, однако проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу скрыть закрытый ключ, выданный приложение для пользователя, или в случае, когда я могу это сделать, поток постоянно останавливается каждые 9 секунд или около того.

Подходы, которые я выбрал:
1. Передача потока из приложения live в dash-live после запуска события on_publish . В течение этого времени генерируется новый открытый ключ потока, а затем закрытый ключ скрывается, и пользователь может просматривать поток, получая доступ к новому открытому ключу, но в этом случае поток останавливается каждые 9 секунд
2. Решение, которое выложено ниже, еще раз - но на странице статистики отображается ключ потока, который генерируется открытым ключом, но файлы для потока сохраняются в папке закрытого ключа, а манифест содержит закрытый ключевая информация, связанная с потоком

Я размышлял над этой проблемой около 10 дней или около того, задавал много вопросов в разных форках на github, однако, похоже, никто не знает, как решить эту проблему (хотя люди пытались это сделать).

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

У меня есть следующий конфиг:

    application live {
        deny play all;      

        live on;
        dash on;

        on_publish http://app.local/api/stream/start;
        on_publish_done http://app.local/api/stream/stop;
        on_update http://app.local/api/stream/update;

        dash_repetition on;
        dash_fragment 5s;
        dash_playlist_length 60s;
        dash_cleanup on;
        dash_nested on;
        dash_clock_compensation http_head;
        dash_clock_helper_uri http://live.local/time;
        dash_path /tmp/dash/stream-dash;
    }

Дело в том, что поток, создаваемый страницей / stats , фактически является новым открытым ключом, однако информация о фрагментах и ​​манифесте по-прежнему записывается в папку закрытого ключа.

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

Screenshot from 2019-03-27 17-21-51 Untitled

P.S. А вот логика генерации нового открытого ключа написана на PHP Screenshot from 2019-03-27 17-27-54

  1. Выписка заявка и имя из запроса
  2. Проверить, действительно ли в запросе есть эти значения (ожидая получить два, поэтому посчитаем их)
  3. Извлечение $ ключа (имя) и $ app (приложение) из полученного массива
  4. Кэширование информации о канале (здесь мы проверяем, существует ли канал с этим ключом потоковой передачи, и если это так, кешируем его в Redis)
  5. Проверка, является ли модель пустым , если это так, то предоставляется неверный ключ потока
  6. Извлечение Пользователь , связанный с Каналом
  7. Проверка, если Пользователь запрещен для потоковой передачи
  8. Создание новой записи Stream (со всеми данными, связанными с потоком RTMP и статусом Live)
  9. Формирование ключа кэша из модели (для исключения дальнейших запросов к базе данных)
  10. Обновление потокового кэша с информацией по умолчанию (все установлено на null )
  11. Отправка события в браузер, что поток начался
  12. Возвращение ответа 301 и установка Местоположение в хэш SHA-512 потока UUID

Ключ, полученный на шаге 12, фактически является новым открытым ключом, и, как вы можете видеть, страница статистики фактически возвращает этот точный ключ, однако данные по-прежнему записываются в ключ, полученный на шаге 3

...