Различия
Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
comet:video:api [2018/01/09 09:48] levhav [Video 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) | ||
| Строка 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>Если обнаружатся проблемы в настройке или в работе или пробелы в документации не стесняйтесь [[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" | + | * 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 ====== | ||
| Строка 96: | Строка 134: | ||
| // Колбек вызываемый перед началом подключения для звонка | // Колбек вызываемый перед началом подключения для звонка | ||
| - | // Предполагается что в нём будут заданы настройки для близжайшего звонка | + | // Предполагается, что в нём будут заданы настройки для близжайшего звонка |
| - | // Такие как и параметры audio_remote, video_local, video_remote и возможно ещё какието. | + | // Такие как и параметры audio_remote, video_local, video_remote и возможно ещё какие–то. |
| // А потом будет вызвана функция cometVideoApi.acceptCall(event) | // А потом будет вызвана функция cometVideoApi.acceptCall(event) | ||
| // А если не будет вызвана то значит мы не взяли трубку. | // А если не будет вызвана то значит мы не взяли трубку. | ||
| Строка 111: | Строка 149: | ||
| } | } | ||
| - | // Берём трубку если хотим | + | // Берём трубку, если хотим |
| cometVideoApi.acceptCall({ | cometVideoApi.acceptCall({ | ||
| // Тип звонка 'audio' | 'video' | // Тип звонка 'audio' | 'video' | ||
| Строка 165: | Строка 203: | ||
| | | ||
| /** | /** | ||
| - | * Колбек когда я и мой собеседник подключились к серверу | + | * Колбек, когда я и мой собеседник подключились к серверу |
| * @param {object} event | * @param {object} event | ||
| * { | * { | ||
| Строка 210: | Строка 248: | ||
| </code> | </code> | ||
| - | <note important>Важно что этот интерфейс не должен быть доступен из внешнй сети. На данный момент в реализована поддержка авторизации (планируется в следующих релизах) и соответственно во избежание утечки данных авторизации надо разрешить доступ к этому порту только доверенным ip адресам с вашими серверами FreeSwitch. Ограничить доступ можно средствами фаервола. </note> | + | <note important>Важно что этот интерфейс не должен быть доступен из внешнй сети. На данный момент не реализована поддержка авторизации (планируется в следующих релизах) и соответственно во избежание утечки данных авторизации надо разрешить доступ к этому порту только доверенным ip адресам с вашими серверами FreeSwitch. Ограничить доступ можно средствами фаервола. </note> |
| Секция [sip] содержит список адресов и портов серверов freeswitch которые готовы обрабатывать видео и аудио звонки. | Секция [sip] содержит список адресов и портов серверов freeswitch которые готовы обрабатывать видео и аудио звонки. | ||
| Строка 220: | Строка 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 из исходников с нужными модулями ===== | ||
| Строка 292: | Строка 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"/> | ||
| Строка 307: | Строка 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> | ||
| Строка 320: | Строка 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]] | ||
| Строка 346: | Строка 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"/> | ||