Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
comet:video:api [2018/01/09 10:18]
levhav [CometQL API]
comet:video:api [2019/12/18 02:05] (текущий)
Строка 2: Строка 2:
 <​rst>​Header:​ API видео чатов</​rst>​ <​rst>​Header:​ API видео чатов</​rst>​
  
-====== Вступление ======+====== ​Comet Video API - Вступление ======
  
-Можно выделить два подхода к организации видео чатов на базе webRTC. Первый это передача сигнала от каждого участника конференции каждому. ​+Ссылка на [[https://​codepen.io/​Levhav/​pen/​MooOzd/​|онлайн демо]] для нетерпеливых 
 +---- 
 + 
 + 
 +Можно выделить два подхода к организации видео чатов на базе webRTC. Первый ​– это передача сигнала от каждого участника конференции каждому. ​
  
 {{ :​comet:​video:​full-mesh.png?​direct |}} {{ :​comet:​video:​full-mesh.png?​direct |}}
  
-В такой конфигурации нет нужды в центральном сервере и её просто реализовать,​ но в тех случаях когда участники находятся за NAT надо всё равно трафик проксировать через turn сервер. ( [[https://​toster.ru/​q/​138501#​answer_399519|Ответ на  toster о преодолении NAT]]  )+В такой конфигурации нет нужды в центральном сервере и её просто реализовать,​ но в тех случаяхкогда участники находятся за NATнадо всё равно трафик проксировать через turn сервер. ( [[https://​toster.ru/​q/​138501#​answer_399519|Ответ на  toster о преодолении NAT]]  )
  
-Но есть ещё проблема в том что много человек в такую конференцию не добавить так как с каждым новым участником будет увеличиваться объём трафика. Так как для конференции на 5 человек вам надо будет отправлять свой поток четверым собеседниками. И получать четыре видео ​ потока от них чтоб видеть всех сразу.+Но есть ещё проблема в томчто много человек в такую конференцию не добавитьтак как с каждым новым участником будет увеличиваться объём трафика. Так как для конференции на 5 человек вам надо будет отправлять свой поток четверым собеседниками. И получать четыре видео ​ потока от нихчтобы видеть всех сразу.
  
 В такой ситуации можно перейти к другому подходу. Когда все абоненты посылают свой сигнал на центральный сервер,​ а тот в свою очередь посылает каждому абоненту один результирующий видео поток. (Именно так и реализовано Video API в CppComet) В такой ситуации можно перейти к другому подходу. Когда все абоненты посылают свой сигнал на центральный сервер,​ а тот в свою очередь посылает каждому абоненту один результирующий видео поток. (Именно так и реализовано Video API в CppComet)
Строка 33: Строка 37:
   * Видео/​Аудио звонки (По WebRTC)   * Видео/​Аудио звонки (По WebRTC)
   * Видео/​Аудио конференции на несколько участников (По WebRTC)   * Видео/​Аудио конференции на несколько участников (По WebRTC)
-  * Видео трансляции для стриминга один ко многим (По WebRTC отправка видео от того кто видео поток публикует и доставка зрителям в форматах hls и mpeg-dash с задержкой от 5 секунд (теоретически минимально возможная задержка для hls потока) до 20 - 40 секунд в зависимости от конфигурации ретрансляторов и настроек качества)+  * Видео трансляции для стриминга один ко многим (По WebRTC отправка видео от тогокто видео поток публикует и доставка зрителям в форматах hls и mpeg-dash с задержкой от 5 секунд (теоретически минимально возможная задержка для hls потока) до 20 - 40 секунд в зависимости от конфигурации ретрансляторов и настроек качества)
    
-<note important>​Если обнаружатся проблемы в настройке или в работе или пробелы в документации не стесняйтесь [[https://​gitter.im/​CppComet/​Lobby|задавать вопросы]] и [[https://​github.com/​CppComet/​comet-server/​issues|писать баг репорты.]]</​note>​+<note important>​Если обнаружатся проблемы в настройке или в работе или пробелы в документациине стесняйтесь [[https://​gitter.im/​CppComet/​Lobby|задавать вопросы]] и [[https://​github.com/​CppComet/​comet-server/​issues|писать баг репорты.]]</​note>​
  
 ====== Демо видео конференций ====== ====== Демо видео конференций ======
Строка 63: Строка 67:
 ====== CometQL API ====== ====== CometQL API ======
  
-В  CometQL добавлена таблица conference которая содержит информацию о активных конференциях.+В  CometQL добавлена таблица conferenceкоторая содержит информацию о активных конференциях.
  
-Чтобы создать новую конференцию и добавить в неё участника надо выполнить запрос ​+Чтобы создать новую конференцию и добавить в неё участниканадо выполнить запрос ​
 <code sql> <code sql>
 INSERT INTO conference (name, user_id, caller_id, message, profile)VALUES('​1',​ 2, 2, "",​ "​video"​);​ INSERT INTO conference (name, user_id, caller_id, message, profile)VALUES('​1',​ 2, 2, "",​ "​video"​);​
Строка 74: Строка 78:
   * name - имя конференции (состоит только из цифр)   * name - имя конференции (состоит только из цифр)
   * user_id - идентификатор добавляемого в конференцию пользователя   * user_id - идентификатор добавляемого в конференцию пользователя
-  * caller_id - идентификатор того пользователя который иницирует звонок (не обязательный параметр)+  * caller_id - идентификатор того пользователякоторый иницирует звонок (не обязательный параметр)
   * message - произвольное сообщение ​   * message - произвольное сообщение ​
-  * profile - режим звонка возможны варианты "​audio", ​ "​video"​ (В open source версии и по запросу в поддержку в saas версии можно создавать свои режимы видео конференций чтоб добавлять водяные знаки, показывать не просто говорящего в данный момет участника конференции,​ а всех сразу или настраивать правила показа участников конференции на общем холсте. Все возможности перечислены в документации на [[https://​freeswitch.org/​confluence/​display/​FREESWITCH/​mod_conference|mod_conference]])+  * profile - режим звонка возможны варианты "​audio", ​ "​video"​ (В open source версии и по запросу в поддержку в saas версии можно создавать свои режимы видео конференцийчтобы добавлять водяные знаки, показывать не просто говорящего в данный момет участника конференции,​ а всех сразу или настраивать правила показа участников конференции на общем холсте. Все возможности перечислены в документации на [[https://​freeswitch.org/​confluence/​display/​FREESWITCH/​mod_conference|mod_conference]])
  
-Чтоб добавить ещё одного участника надо выполнить такой же запрос только передать новый user_id и старый name. Соответственно создание конференции из 5 участников потребует 5 запросов вставки в таблицу conference+Чтобы добавить ещё одного участниканадо выполнить такой же запрос только передать новый user_id и старый name. Соответственно создание конференции из 5 участников потребует 5 запросов вставки в таблицу conference
  
 Пример можно смотреть в файле [[https://​github.com/​CppComet/​video-chat-example|call.php]] Пример можно смотреть в файле [[https://​github.com/​CppComet/​video-chat-example|call.php]]
Строка 94: Строка 98:
 <note important>​В запросах оператор `and` работает в ограниченном режиме. Он работает только для таблиц `conference` и `conference_members` только для запроса `delete` и только с полями `name` и `user_id` <note important>​В запросах оператор `and` работает в ограниченном режиме. Он работает только для таблиц `conference` и `conference_members` только для запроса `delete` и только с полями `name` и `user_id`
  
-Полноценная поддержка оператора `and` в синтаксисе запросов будет реализована позже, так как и без него есть куда более важные задачи и работе отсутствие оператора end не мешает.+Полноценная поддержка оператора `and` в синтаксисе запросов будет реализована позже, так как и без него есть куда более важные задачи и работе отсутствие оператора end не мешает.
 </​note>​ </​note>​
 +
 +Запрос выборки из таблицы `conference` только покажет,​ кому были отправлены приглашения в конференцию.
 +<code sql>
 +select * from `conference` where name = "​101";​
 +</​code>​
 +Вовсе не факт, что все эти люди до сих пор в этой конференции находятся.
 +
 +Чтобы узнать,​ кто разговаривает в данный момент надо сделать запрос к таблице `conference_members`
 +<code sql>
 +select * from `conference_members`
 +</​code>​
 +В данный момент таблица `conference_members` доступна только для чтения и содержит такие поля ​
 +
 +  * name - имя конференции
 +  * user_id - идентификатор пользователя
 +  * join_time - количество секунд прошедшее с момента подключения пользователя
 +  * last_talking - количество секунд прошедшее с того момента,​ когда он что-то говорил в конференции.
 +
 +
 +
  
  
Строка 110: Строка 134:
  
   // Колбек вызываемый перед началом подключения для звонка   // Колбек вызываемый перед началом подключения для звонка
-  // Предполагается что в нём будут заданы настройки для близжайшего звонка +  // Предполагаетсячто в нём будут заданы настройки для близжайшего звонка 
-  // Такие как и параметры audio_remote,​ video_local,​ video_remote и возможно ещё какието.+  // Такие как и параметры audio_remote,​ video_local,​ video_remote и возможно ещё какието.
   // А потом будет вызвана функция cometVideoApi.acceptCall(event)   // А потом будет вызвана функция cometVideoApi.acceptCall(event)
   // А если не будет вызвана то значит мы не взяли трубку.   // А если не будет вызвана то значит мы не взяли трубку.
Строка 125: Строка 149:
     }     }
  
-    // Берём трубку если хотим+    // Берём трубкуесли хотим
     cometVideoApi.acceptCall({     cometVideoApi.acceptCall({
       // Тип звонка '​audio'​ | '​video'​       // Тип звонка '​audio'​ | '​video'​
Строка 179: Строка 203:
   ​   ​
   /**   /**
-   * Колбек когда я и мой собеседник подключились к серверу+   * Колбеккогда я и мой собеседник подключились к серверу
    * @param {object} event    * @param {object} event
    * {    * {
Строка 224: Строка 248:
 </​code>​ </​code>​
  
-<note important>​Важно что этот интерфейс не должен быть доступен из внешнй сети. На данный момент ​в реализована поддержка авторизации (планируется в следующих релизах) и соответственно во избежание утечки данных авторизации надо разрешить доступ к этому порту только доверенным ip адресам с вашими серверами FreeSwitch. Ограничить доступ можно средствами фаервола. </​note>​+<note important>​Важно что этот интерфейс не должен быть доступен из внешнй сети. На данный момент ​не реализована поддержка авторизации (планируется в следующих релизах) и соответственно во избежание утечки данных авторизации надо разрешить доступ к этому порту только доверенным ip адресам с вашими серверами FreeSwitch. Ограничить доступ можно средствами фаервола. </​note>​
  
 Секция [sip] содержит список адресов и портов серверов freeswitch которые готовы обрабатывать видео и аудио звонки. Секция [sip] содержит список адресов и портов серверов freeswitch которые готовы обрабатывать видео и аудио звонки.
Строка 234: Строка 258:
 pipesalt = pipeSecretSalt pipesalt = pipeSecretSalt
 </​code>​ </​code>​
 +
 +
 +===== Настройка FreeSwitch =====
 +
 +Есть [[https://​hub.docker.com/​r/​cppcomet/​freeswitch-video/​|docker образ]] с нужными настройками для работы ​ FreeSwitch с комет сервером.
 +
 +Скачать образ ​
 +<code bash>
 +docker pull cppcomet/​freeswitch-video
 + </​code>​
 +
 +Запустить
 +<code bash>
 +docker run -v /​root/​FreeSwitch-in-docker/​conf:/​usr/​local/​freeswitch/​conf -v /​root/​FreeSwitch-in-docker/​certs:/​usr/​local/​freeswitch/​certs --net host -it cppcomet/​freeswitch-video
 + </​code>​
 +
 +Нужно указать доступ к ssl сертификату и папке с файлами конфигурации.
 +
 +
 +
  
 ===== Сборка ​ FreeSwitch из исходников с нужными модулями ===== ===== Сборка ​ FreeSwitch из исходников с нужными модулями =====
Строка 306: Строка 350:
 =====  Включение модулей в автозагрузку ​  ​===== ​ =====  Включение модулей в автозагрузку ​  ​===== ​
  
-Для включения в автозагрузку модулей надо убедится что в файле /​usr/​local/​freeswitch/​conf/​autoload_configs/​modules.conf.xml есть следующие строки+Для включения в автозагрузку модулей надо убедитсячто в файле /​usr/​local/​freeswitch/​conf/​autoload_configs/​modules.conf.xml есть следующие строки
 <code xml> <code xml>
 <load module="​mod_av"/>​ <load module="​mod_av"/>​
Строка 321: Строка 365:
 ==== Настройка xml_curl.conf на freeswitch ====  ==== Настройка xml_curl.conf на freeswitch ==== 
  
-В файле <​code>/​usr/​local/​freeswitch/​conf/​autoload_configs/​xml_curl.conf.xml</​code>​ надо вписать порт и адрес для подключения к комет серверу с реквизитами которые мы задали в секции [freeswitch]+В файле <​code>/​usr/​local/​freeswitch/​conf/​autoload_configs/​xml_curl.conf.xml</​code>​ надо вписать порт и адрес для подключения к комет серверу с реквизитамикоторые мы задали в секции [freeswitch]
  
 <code xml> <code xml>
Строка 334: Строка 378:
 </​code>​ </​code>​
  
-Эта настройка отвечает за то что бы пользователи которые авторизованы на комет сервере могли по тем же данным авторизации подключится к freeswitch для совершения звонка.+Эта настройка отвечает за точтобы пользователикоторые авторизованы на комет сервере могли по тем же данным авторизации подключится к freeswitch для совершения звонка.
  
 Подробности по работе модуля тут [[https://​freeswitch.org/​confluence/​display/​FREESWITCH/​mod_xml_curl+PHP+example|mod_xml_curl]] Подробности по работе модуля тут [[https://​freeswitch.org/​confluence/​display/​FREESWITCH/​mod_xml_curl+PHP+example|mod_xml_curl]]
Строка 360: Строка 404:
     <​extension name="​comet_conferences">​     <​extension name="​comet_conferences">​
       <​condition field="​destination_number"​ expression="​^([0-9]{1,​9}\*[0-9A-z\-_]+)\*([0-9A-z\-_]+)$">​       <​condition field="​destination_number"​ expression="​^([0-9]{1,​9}\*[0-9A-z\-_]+)\*([0-9A-z\-_]+)$">​
-        ​<​!-- ​Надо проверить что номер ​абонента начинается на такие же 6 первых цифр что и номер конференции --> +     ​<!-- 
-        <!-- Надо проверить ​что у абонента есть доступ к конференции --> +                    Если у вас только аудио звонок то можно добавить ​эту строку 
- <action application="​set"​ data="​absolute_codec_string=PCMU,​GSM"/>​+                    <action application="​set"​ data="​absolute_codec_string=PCMU,​GSM"/​
 +             -->
      <action application="​answer"/>​      <action application="​answer"/>​
      <action application="​conference"​ data="​$1-${domain_name}@$2"/>​      <action application="​conference"​ data="​$1-${domain_name}@$2"/>​