Прием публикаций по 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()
Чтобы запустить этот конфигурационный бэкенд:
- Создайте в любом текстовом редакторе файл
/tmp/config_server.py
с приведенным выше кодом. -
Установите Python, если еще не установлен.
apt install python3
-
Запустите конфигурационный бэкенд на свободном порту, например 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.