Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
comet:video:api [2018/01/09 09:46] levhav [Вступление] |
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) | ||
Строка 27: | Строка 31: | ||
====== Video API ====== | ====== Video API ====== | ||
- | В комет сервер встроена интеграция с FreeSwitch упрощающая создание видио конференций и видео чатов. | + | В комет сервер встроена интеграция с FreeSwitch упрощающая создание видио конференций и видео чатов. (С возможностью использовать всё это в режиме кластера) |
Есть возможность совершать: | Есть возможность совершать: | ||
Строка 33: | Строка 37: | ||
* Видео/Аудио звонки (По WebRTC) | * Видео/Аудио звонки (По WebRTC) | ||
* Видео/Аудио конференции на несколько участников (По WebRTC) | * Видео/Аудио конференции на несколько участников (По WebRTC) | ||
- | * Видео трансляции для стриминга один ко многим (По WebRTC отправка видео от того кто стрим публикует и доставка зрителям по hls и mpeg-dash с задержкой от 5 секунд (теоритически минимально возможная задержка для hls стрима) до 20 - 40 секунд в зависимости от конфигурации ретрансляторов и настроек качества) | + | * Видео трансляции для стриминга один ко многим (По WebRTC отправка видео от того, кто видео поток публикует и доставка зрителям в форматах hls и mpeg-dash с задержкой от 5 секунд (теоретически минимально возможная задержка для hls потока) до 20 - 40 секунд в зависимости от конфигурации ретрансляторов и настроек качества) |
- | + | ||
- | <note important>Важно иметь в виду что не смотря на то что этот функционал работает хорошо, но API ещё не полностью реализовано и часть функций станут доступны в следующих версиях. Скорее всего обратная совместимость не будет нарушена но пока нет 100% гарантии.</note> | + | <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> | + | |
====== Демо видео конференций ====== | ====== Демо видео конференций ====== | ||
Строка 65: | Строка 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"); | ||
Строка 76: | Строка 78: | ||
* name - имя конференции (состоит только из цифр) | * name - имя конференции (состоит только из цифр) | ||
* user_id - идентификатор добавляемого в конференцию пользователя | * user_id - идентификатор добавляемого в конференцию пользователя | ||
- | * caller_id - идентификатор того пользователя который иницирует звонок (не обязательный параметр) | + | * caller_id - идентификатор того пользователя, который иницирует звонок (не обязательный параметр) |
- | * message - произвольное сообщение сообщение | + | * message - произвольное сообщение |
- | * profile - режим звонка возможны варианты "audio", "video" | + | * 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]] | ||
+ | |||
+ | Выборка данных из таблицы conference | ||
+ | <code sql> | ||
+ | select * from `conference` where name = "101"; | ||
+ | </code> | ||
+ | |||
+ | Удаление данных из таблицы conference | ||
+ | <code sql> | ||
+ | delete from `conference` where name = "101" and user_id = 29130; | ||
+ | </code> | ||
+ | |||
+ | <note important>В запросах оператор `and` работает в ограниченном режиме. Он работает только для таблиц `conference` и `conference_members` только для запроса `delete` и только с полями `name` и `user_id` | ||
+ | |||
+ | Полноценная поддержка оператора `and` в синтаксисе запросов будет реализована позже, так как и без него есть куда более важные задачи и работе отсутствие оператора end не мешает. | ||
+ | </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 - количество секунд прошедшее с того момента, когда он что-то говорил в конференции. | ||
+ | |||
+ | |||
+ | |||
- | <note important>Вообще потом можно будет ещё и select делать из таблицы conference но он пока не реализован так что на данный момент получить список активных конференций с активными участниками нельзя.</note> | ||
====== JavaScript API ====== | ====== JavaScript API ====== | ||
Строка 98: | Строка 134: | ||
// Колбек вызываемый перед началом подключения для звонка | // Колбек вызываемый перед началом подключения для звонка | ||
- | // Предполагается что в нём будут заданы настройки для близжайшего звонка | + | // Предполагается, что в нём будут заданы настройки для близжайшего звонка |
- | // Такие как и параметры audio_remote, video_local, video_remote и возможно ещё какието. | + | // Такие как и параметры audio_remote, video_local, video_remote и возможно ещё какие–то. |
// А потом будет вызвана функция cometVideoApi.acceptCall(event) | // А потом будет вызвана функция cometVideoApi.acceptCall(event) | ||
// А если не будет вызвана то значит мы не взяли трубку. | // А если не будет вызвана то значит мы не взяли трубку. | ||
Строка 113: | Строка 149: | ||
} | } | ||
- | // Берём трубку если хотим | + | // Берём трубку, если хотим |
cometVideoApi.acceptCall({ | cometVideoApi.acceptCall({ | ||
// Тип звонка 'audio' | 'video' | // Тип звонка 'audio' | 'video' | ||
Строка 167: | Строка 203: | ||
| | ||
/** | /** | ||
- | * Колбек когда я и мой собеседник подключились к серверу | + | * Колбек, когда я и мой собеседник подключились к серверу |
* @param {object} event | * @param {object} event | ||
* { | * { | ||
Строка 212: | Строка 248: | ||
</code> | </code> | ||
- | <note important>Важно что этот интерфейс не должен быть доступен из внешнй сети. На данный момент в реализована поддержка авторизации (планируется в следующих релизах) и соответственно во избежание утечки данных авторизации надо разрешить доступ к этому порту только доверенным ip адресам с вашими серверами FreeSwitch. Ограничить доступ можно средствами фаервола. </note> | + | <note important>Важно что этот интерфейс не должен быть доступен из внешнй сети. На данный момент не реализована поддержка авторизации (планируется в следующих релизах) и соответственно во избежание утечки данных авторизации надо разрешить доступ к этому порту только доверенным ip адресам с вашими серверами FreeSwitch. Ограничить доступ можно средствами фаервола. </note> |
Секция [sip] содержит список адресов и портов серверов freeswitch которые готовы обрабатывать видео и аудио звонки. | Секция [sip] содержит список адресов и портов серверов freeswitch которые готовы обрабатывать видео и аудио звонки. | ||
Строка 222: | Строка 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 из исходников с нужными модулями ===== | ||
Строка 294: | Строка 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"/> | ||
Строка 309: | Строка 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> | ||
Строка 322: | Строка 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]] | ||
Строка 348: | Строка 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"/> |