← Назад к списку статей

API для WebRTC: получение видеопотока и записи

webrtc_api

API для WebRTC

Сейчас для работы с видео в браузерах Xeoma использует технологию WebRTC, которая выдаёт более стабильную картинку и позволяет уменьшить нагрузку на сервер. Однако это не все преимущества WebRTC – эта технология также открывает новые горизонты в области интеграции. В частности, с помощью WebRTC видео, полученное из Xeoma, можно добавить на сайт или в какое-либо стороннее приложение. В этой статье мы подробно рассмотрим, как именно можно проделать такую интеграцию. Обратите внимание, что структура запросов и ответов на них во многом схожа с нашим JSON API. Все нижеперечисленные команды представляют собой GET-запросы. Для корректной работы WebRTC API у сервера Xeoma должно быть стабильное соединение со STUN сервером (подробнее см. пункт 9).
Этот API поделён на две основные части: просмотр онлайн и просмотр архива.
Все команды начинаются с http://IP:10090/ – где IP это IP-адрес сервера. Оставшаяся часть каждой команды описана ниже.

Important advice from Xeoma Эта возможность доступна в PRO-редакции программы. Попробовать WebRTC API в тестовом режиме вы можете с помощью Пробной версии.

 

Просмотр онлайн

  1. ?get_available_webrtc_streams=
    Эта команда запрашивает актуальный список камер сервера с параметрами, которые нам понадобятся для получения видео. Ответ будет такого вида:
    {
    "192.168.0.77 Cam_2": "?sourcewebrtc=687474703A2F2F6C6F63616C686F73743A31303039302F766964656F322E6D6A70673F757365723D&webServerId=WebconnectorTransmitter.2"
    }

    Ключевая информация из этого ответа – значения параметров sourcewebrtc и webServerId, а IP-адрес и имя камеры здесь указываются, чтобы понять, к какой именно камере относятся параметры.
  2. ?sourcewebrtc=687474703A2F2F6C6F63616C686F73743A31303039302F766964656F322E6D6A70673F757365723D&webServerId=WebconnectorTransmitter.2&example=
    Эта команда запрашивает поток от нужной камеры (по значению параметра sourcewebrtc) через нужный модуль Веб Сервер (по значению параметра webServerId) по WebRTC API. В браузере по этой команде откроется пустая страница с видео с этой камеры в реальном времени.
  3. Чтобы внешнее приложение (или сайт) смогло получить доступ к такому потоку, ему сначала нужно соединиться с Xeoma, этим занимается скрипт webrtc_view_common.js (находится в папке XeomaWeb в основной директории). В нём есть метод connectWithWebrtcServer – его необходимо вызвать при загрузке нужной страницы. Этот же скрипт выполнит всё остальную работу по получению потока сам.
  4. Ещё один скрипт, который понадобится при загрузке страницы – webrtc_adapter_min.js, он находится в той же директории.
  5. Полученный поток должен быть прикреплён к тэгу <video>. Один из методов скрипта webrtc_view_common.js (а именно onRemoteTrack) занимается таким прикреплением. В итоге нужный HTML-файл должен содержать такие строчки:
    <video id="remote-video" autoplay></video>
    <audio id="remote-audio" autoplay></audio>

Просмотр архива

  1. ?archive_list=
    Эта команда запрашивает актуальный список архивов указанного сервера. Ответ будет такого вида:
    Preview+Archive.12
    Preview+Archive.18
    Preview+Archive.7
    Preview+Archive.21
    Preview+Archive.24
  2. ?archive_date_list=&archive=NameArchive
    NameArchive – имя нужного архива.
    Эта команда запрашивает список дат, за которые в указанном архиве есть какие-то записи. Важно: имя Preview+Archive.12 здесь превратится Preview%2BArchive.12. Ответ будет такого вида (даты в формате гггг-мм-дд):
    2020-08-22
    2020-08-23
    2020-08-24
    2020-08-25
    2020-08-31
  3. ?archive_minutes=&archive_date=2020-08-24&archive=NameArchive
    2020-08-24 – нужная дата.
    Эта команда запрашивает список минут, за которые есть какие-либо записи в нужный день. Часовой пояс для него берётся по серверу. Ответ будет такого вида (время в формате чч:мм:сс):
    16:39:14
    16:40:14
    16:41:14
    16:42:13
    16:43:13
    16:44:13
  4. ?start_webrtc_archive=&archive=NameArchive&peer_id=123&archive_date=2020-08-24&archive_minute=16:40:00&archive_millis=1400
    123 – уникальный идентификатор, полученный от сервера WebRTC (см. пункт 9).
    16:40:00 – нужная минута.
    14000 – номер миллисекунды от начала этой минуты.
    Эта команда запускает трансляцию нужного фрагмента архива, начиная с заданной миллисекунды. Важно: параметр archive_millis не может превышать значение 60000, его необходимо сбрасывать при каждом переходе между минутами.
  5. ?stop_webrtc_archive=&archive=NameArchive&peer_id=123
    Эта команда останавливает ранее запущенную трансляцию.
  6. ?get_last_archive_time=&archive=NameArchive&peer_id=123
    Эта команда запрашивает номер миллисекунды, которая проигрывается в данный момент для нудного архива. Это полезно для синхронизации (например, со шкалой времени на странице проигрывания архива). Ответ будет такого вида:
    {
    "EOF":false,
    "millisFromMinuteStart":15018,
    "time":"16:40"
    }
  7. Перед тем, как получить доступ просмотру архива, страница должна загрузить следующие скрипты:
    webrtc_view_common.js
    webrtc_adapter_min.js
  8. Чтобы подключиться к серверу WebRTC, клиент должен вызвать методы getRequestUrl и onConnect из скрипта webrtc_view_common.js. Пример соответствующего кода:
    $.ajax({
    url: getRequestUrl("connect"),
    success: onConnect,
    error: function(xhr, status, error) { onError("Connect failed: " + error); }
    });
  9. Метод onConnect задаёт значение параметру webrtcid, это значение нужно присваивать параметру peer_id (см. пункты 4-6). Это значение для WebRTC API выдаёт STUN сервер, по умолчанию используется stun.l.google.com:19302. Этот адрес можно сменить на другой (в том числе на собственный STUN сервер) в скрипте webrtc_view_common.js (строка 2).
  10. Полученный поток должен быть прикреплён к тэгу <video>. Один из методов скрипта webrtc_view_common.js (а именно onRemoteTrack) занимается таким прикреплением. В итоге нужный HTML-файл должен содержать такие строчки:
    <video id="remote-video" autoplay></video>
    <audio id="remote-audio" autoplay></audio>

15 сентября 2020

Читайте также:
API для интеграции с Xeoma
Модуль Отправка HTTP команд в Xeoma