Skip to content

Прием публикаций по SRT от множества авторов

Чтобы принять публикацию по SRT от множества авторов, централизованно выдав каждому автору уникальный passphrase, используйте механизм srt_port_resolve, предлагаемый в Flussonic для публикации по SRT в облако. Подробнее об этом решении см. на странице SRT.

Note

Альтернатива — добавить потоки в конфигурацию Flussonic вручную. Но этот способ плохо работает, когда у вас десятки серверов и тысячи авторов: нужно будет как-то определять, на каком сервере принимать поток от того или иного автора, а местом хранения passphrase будут не синхронизируемые автоматически файлы конфигурации на серверах.

Шаг 1. Создайте конфигурационный бэкенд

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

from http.server import BaseHTTPRequestHandler, HTTPServer
import urllib.parse as urlparse

class RequestHandler(BaseHTTPRequestHandler):
    streams_config = {
        "streams": [
            {
                "name": "publish_stream_name",
                "inputs": [
                    {"url": "publish://"}
                ],
                "srt_publish": {"passphrase": "securePass"}
            },
            {
                "name": "other_publish_stream",
                "inputs": [
                    {"url": "publish://"}
                ],
                "srt_publish": {"passphrase": "otherPassword"}
            }
        ]
    }

    port_stream_mapping = (
        (2345, "publish_stream_name"),
        (2346, "other_publish_stream"),
    )

    def do_GET(self):
        parsed_path = urlparse.urlparse(self.path)
        path = parsed_path.path
        query_components = urlparse.parse_qs(parsed_path.query)

        # Handle /config_backend/streams
        if path.startswith('/config_backend/streams'):
            self.send_response(200)
            self.send_header('Content-Type', 'application/json')
            self.end_headers()
            response = self.streams_config
            self.wfile.write(bytes(str(response), "utf8"))

        # Handle /config_backend/srt_port_resolve/{port}
        elif path.startswith('/config_backend/srt_port_resolve/'):
            port = int(path.split('/')[-1])
            mode = query_components.get('mode', [None])[0]
            host = query_components.get('host', [None])[0]

            response = next((stream_name for port_number, stream_name in self.port_stream_mapping if port_number == port), None)

            if response and mode == 'publish':
                self.send_response(200)
                self.send_header('Content-Type', 'text/plain')
                self.end_headers()
                self.wfile.write(bytes(response, "utf8"))
            else:
                self.send_error(400, "Invalid port or mode.")
                return

        else:
            self.send_error(404, "404 Not Found")

def run(server_class=HTTPServer, handler_class=RequestHandler, port=12345):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f'Starting httpd on port {port}...')
    httpd.serve_forever()

if __name__ == "__main__":
    from sys import argv

    if len(argv) == 2:
        run(port=int(argv[1]))
    else:
        run()

Чтобы запустить этот конфигурационный бэкенд:

  1. Создайте в любом текстовом редакторе файл /tmp/config_server.py с приведенным выше кодом.
  2. Установите Python, если еще не установлен.

    apt install python3

  3. Запустите конфигурационный бэкенд на свободном порту, например 12345.

    python3 /tmp/server.py 12345

Шаг 2. Настройте Flussonic для использования бэкенда

Flussonic должен знать, откуда ему брать конфигурацию потока и на каких портах ожидать публикации по SRT. Отправьте ему адрес конфигурационного бэкенда и диапазон портов SRT с помощью API-запроса PUT /streamer/api/v3/config:

curl -u USER:PASSWORD -X PUT http://localhost:80/streamer/api/v3/config \
-H "Content-Type: application/json" \
--data '{"listeners": {"srt": [ {"mode":"publish","ports":{"first":2345,"last":12344}}]},"config_external": "http://localhost:12345/config_backend/"}'

Через 5—10 секунд после выполнения этой команды в UI должны создаться потоки publish_stream_name и other_publish_stream, которые Flussonic получит от конфигурационного бэкенда.

Шаг 3. Проверьте, что все работает

Опубликуйте поток во Flussonic:

ffmpeg -re -i /opt/flussonic/priv/bunny.mp4 -c copy -y -f mpegts 'srt://localhost:2345?passphrase=securePass'

Проверьте в UI, что видео проигрывается в профиле потока publish_stream_name на вкладке Overview.

Связанные задачи