#include "Keyboard.h"// OS parameterstypedef enum { LINUX, WINDOWS, MAC} os_types;// Change this to your operating systemconst os_types OS = MAC;// Pinsconst int btn_pin = 2;const int led_pin = 9;// Constantsconst int debounce_delay = 50; // ms// Globalsint btn_state = HIGH;int btn_prev = HIGH;unsigned long last_debounce_time = 0;int os_ctrl;int led_state = LOW;void setup() { Serial.begin(57600); // opens serial port, sets data rate to 57600 bps // Set up LED and button pins pinMode(btn_pin, INPUT_PULLUP); // Set the button as an input pinMode(led_pin, OUTPUT); digitalWrite(led_pin, led_state); // Begin keyboard Keyboard.begin(); // Switch to correct control/command key switch(OS){ case LINUX: case WINDOWS: os_ctrl = KEY_LEFT_CTRL; break; case MAC: os_ctrl = KEY_LEFT_GUI; break; default: os_ctrl = KEY_LEFT_CTRL; break; } // Get initial timestamp Serial.println("started"); }void loop() { // Read current state of the button int btn_read = digitalRead(btn_pin); // Remember when the button changed states if ( btn_read != btn_prev ) { last_debounce_time = millis(); } // Wait before checking the state of the button again if ( millis() > (last_debounce_time + debounce_delay) ) { if ( btn_read != btn_state ) { btn_state = btn_read; if ( btn_state == LOW ) { // Send cmd+shift+a Keyboard.press(KEY_LEFT_SHIFT); Keyboard.press(os_ctrl); Keyboard.press('a'); delay(100); Keyboard.releaseAll(); Serial.println("pressed"); if (led_state == LOW) { led_state = HIGH; } else { led_state = LOW; } digitalWrite(led_pin, led_state); } } } // Remember the previous button position for next loop() btn_prev = btn_read; if (Serial.available() > 0) { String incomingString = Serial.readStringUntil('\n'); if (incomingString == "muted") { led_state = LOW; } else if (incomingString == "unmuted") { led_state = HIGH; } digitalWrite(led_pin, led_state); } }
set zoomStatus to "closed"set muteStatus to "disabled"tell application "System Events"if exists (window 1 of process "zoom.us") thenset zoomStatus to "open"tell application process "zoom.us"if exists (menu bar item "Meeting" of menu bar 1) thenset zoomStatus to "call"if exists (menu item "Mute audio" of menu 1 of menu bar item "Meeting" of menu bar 1) thenset muteStatus to "unmuted"elseset muteStatus to "muted"end ifend ifend tellend ifend tellcopy "{\"mute\":\"" & (muteStatus as text) & "\",\"status\":\"" & (zoomStatus as text) & "\"}" to stdout
$ osascript get-zoom-status.scpt{"mute":"muted","status":"call"}
const { exec } = require('child_process');const SerialPort = require('serialport');const Readline = require('@serialport/parser-readline');const port = new SerialPort('/dev/tty.usbmodemHIDPC1', { baudRate: 57600});var checkStatus = function() { console.log('Checking status...'); exec('osascript get-zoom-status.scpt', (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`); return; } var status = JSON.parse(stdout); if (status.mute == 'unmuted') { port.write('unmuted'); } else { port.write('muted'); } });}const parser = port.pipe(new Readline({ delimiter: '\r\n' }))parser.on('data', function (data) { if (data == "pressed") { console.log('Button pressed.'); checkStatus(); }})checkStatus();setInterval(checkStatus, 30000);
2020 год однозначно можно назвать годом Zoom. Такого количества онлайн-встреч, кажется, не было никогда. И в начале 2021 пока изменений не видно. Но есть способы разнообразить это и заодно немного повеселиться. Эта кнопка аварийного выхода из Zoom позволяет мгновенно выйти из конференции. Она проста в изготовлении и требует очень небольшого опыта работы с электроникой. Я сделал её, потому что я всегда искал кнопку выхода в нижней части экрана и, казалось, всегда был тем человеком, который уходил с каждого собрания последним. Теперь, когда я сделал кнопку аварийного выхода, я могу уйти с любого собрания Zoom как чемпион. Я бы сказал, что качество моей жизни улучшилось на 357 % (плюс-минус).
(X1) Блок аварийной кнопки.
(X1) Контроллер Adafruit Trinket M0.
(X1) Микро-USB кабель.
(X2) 22AWG M4 Вилочная клемма.
(X2) 6-дюймовые многожильные провода.
(X1) Кнопка мгновенного действия (опционально).
Инструменты:
(X1) Паяльник.
(X1) Инструмент для зачистки проводов.
(X1) Отвёртка.
(X1) Канцелярский нож.
Этот проект предполагает, что у вас есть некоторые практические знания об Arduino. Тем не менее я остановлюсь на процессе установки программного обеспечения.
Прежде всего загрузите Arduino IDE, если вы ещё это не сделали.
Затем вам нужно будет добавить Adafruit Trinket M0 в Arduino IDE. Самый простой способ сделать это следовать инструкциям по установке на странице Adafruit.
Наконец, настройте плату следующим образом
Tools > Board > Adafruit Trinket M0.
Tools > Port > /dev/cu.usbmodem (или похожие).
Загрузите в контроллер следующий код:
// ******************************************************// // Code for quitting Zoom quickly//// Designed for Adafruit Trinket M0// by Randy Sarafan//// For more info check out:// https://www.instructables.com/Easy-Zoom-Quit-Button///// ******************************************************// Add the keyboard library#include <Keyboard.h>void setup() { // Configure Pin 2 as input switch. // Triggered when connected to ground. pinMode(2, INPUT_PULLUP); // Start running the board as a virtual computer keyboard Keyboard.begin(); }void loop() { // Check for a button press event if (digitalRead(2) == LOW) { // Press command w and wait 1/10 second Keyboard.press(KEY_LEFT_GUI); Keyboard.press('w'); delay(100); // Release all keyboard keys Keyboard.releaseAll(); // Press the return key and wait 1/10 second Keyboard.press(KEY_RETURN); delay(100); // Release all keyboard keys Keyboard.releaseAll(); // Wait for the pushbutton to be released before resuming while (digitalRead(2) == LOW){ delay(1000); } }}
Отрежьте два провода диаметром 6 дюймов. Предпочтительно, чтобы один был чёрным (для заземления), а другой любого другого цвета, который вам нужен.
Зачистите один конец каждого провода и обожмите клеммы вилки на концах каждого из них.
Припаяйте чёрный провод к земле.
Другой провод припаяйте к контакту 2.
Примечание: если вы не умеете паять, вы можете узнать, как это сделать, в моей инструкции Введение в пайку.
Найдите резиновую втулку корпуса.
С помощью лезвия бритвы сделайте небольшую прорезь, чтобы пропустить через неё конец USB-кабеля, а затем сделайте это.
Установите резиновую втулку в корпус, а затем подключите кабель USB к контроллеру Trinket M0.
Блок аварийного выключателя поставляется с блокирующим выключателем. Это означает, что, когда вы нажимаете на него, кнопка фиксируется на месте и остается там, пока вы её не повернёте и не отпустите.
Я хотел, чтобы моя кнопка не фиксировалась. Таким образом, я решил заменить её выключателем мгновенного действия с пружиной.
Для этого я просто разобрал фиксирующую кнопку и вынул её из корпуса. Затем я разобрал и вместо этого установил кнопку мгновенного действия.
Внутри коммутатора есть два набора соединений. Один нормально открытый (не подключён), а другой нормально закрытый (подключён). Мы хотим подключить два провода к нормально разомкнутому контакту. Таким образом, при нажатии кнопки соединение закрывается.
Обычно эти соединения маркированы. В моём переключателе этого не было, но корпус был чистым, и я мог видеть, какое соединение было тем, которое обычно не подключается к клеммам.
Я прикрепил плоские клеммы на печатной плате к этим двум клеммам с помощью крепёжных винтов.
Примечание: не беспокойтесь, если вы ошибётесь. Просто подключите провода к другому набору клемм.
Установите крышку на корпус и закрепите её крепёжными винтами.
Чтобы использовать это, просто подключите его к USB-порту.
Когда вы будете готовы выйти с собрания в Zoom, просто нажмите кнопку.
Вот и всё.
Такая кнопка пригодится и на наших вебинарах, которые мы на
регулярной основе проводим для наших студентов на всех курсах. На
них менторы разбирают со студентами особо сложные темы, попутно
отвечая на вопросы. Неважно, какое направление вы выберете
Этичный хакинг,
Data Science илиMachine
Learning на каждом из них вы найдёте современную программу и
внимательную службу поддержки.
Узнайте, как прокачаться в других специальностях или освоить их с нуля:
Другие профессии и курсыПРОФЕССИИ
КУРС
В период пандемии многие конференции стали онлайновыми. Моя знакомая из Smartcat занимается организацией онлайн-мероприятий, и я захотел узнать у неё, какие инструменты для запуска массовых конференций есть сегодня.
Эта статья о том, как выбрать платформу для проведения своих онлайн-событий, какие полезные функции есть у разных продуктов, какой рейтинг и что по стоимости. Читайте наш материал, примеряйте эти инструменты к своим задачам и выбирайте ту платформу, которая подходит именно вам.
С началом пандемии большую часть мероприятий поставили на паузу, оставшиеся перенесли в онлайн. Рынок конференц-связи накрыла волна ажиотажа: организаторы искали лучшие решения. Microsoft Teams, Google Meet, YouTubeLive, Skype for Business, Webex, Zoom это только малая часть всего многообразия технологий, которые тестировали ивент-менеджеры. Волновал уже не кейтеринг и поиск площадки, а какие есть возможности для вовлечения аудитории.
Конференц-лихорадка не обошла стороной и команду Smartcat. В начале апреля 2020-го они выбирали идеальную платформу для своего первого онлайн-события LocFromHome. Времени было мало, а критериев много. Инструмент должен был:
поддерживать 12-часовую трансляцию;
пропускать 4000 регистраций;
вмещать до 500 участников одновременно;
предлагать варианты месячной подписки, так как конференция проходит только пару раз в год;
иметь хорошую службу поддержки;
собирать аналитику и статистику;
давать возможности для вовлечения аудитории (опросы, Q&A, чат, отдельные комнаты для нетворкинга и так далее).
После непродолжительных поисков выбор сузили до пяти платформ. Подробнее о каждой из них ниже.
Система ON24 сейчас один из лучших продуктов по отзывам на G2.com для проведения вебинаров и онлайн-мероприятий. У них почти 750 отзывов при среднем рейтинге 4,3 из 5. Из тех функций, что нравятся пользователям review-сайтов:
онлайн-регистрация участников удобно знать своих зрителей в лицо;
отчеты по активности зрителей что и как смотрят и тому подобное.
В ON24 есть разграничение доступа к контенту и частям системы по ролям пользователей и переключение языков трансляции в режиме реального времени.
К сожалению, ценовая политика сервиса перекрывает его многочисленные плюсы она запутанная, с множеством разных сценариев. Есть как минимум семь вариантов, для каждого из которых надо запрашивать демо-версию. Притом на сайте точной информации о стоимости нет.
Для LocFromHome подошли бы только варианты, доступные при годовой подписке. Цены на такую подписку колеблются от $24 000 до $41 000. Для компании, которая проводит две-три онлайн-конференции в год, это было слишком много, поэтому пришлось искать альтернативы.
Один из конкурентов ON24. У продукта 157 отзывов на review-сайте Capterra, общий рейтинг составляет 4,8 из 5. На платформе есть как функции, доступные в предыдущем продукте, так и то, чего в ON24 нет:
бейджи функция помогает помечать организаторов, докладчиков и зрителей и управлять ими, в ON24 этой фичи нет;
проведение опросов повышают вовлеченность зрителей;
комната ожидания (виртуальное лобби).
Из минусов лимит в девять часов при онлайн-стриминге. Для LocFromHome нужна была одна ссылка для всей конференции, не хотелось пересоздавать ее несколько раз. Ну и цена за подписку в $13 000 показалась слишком большой, хотя это и ощутимо меньше, чем в предыдущем случае.
Раньше Smartcat уже использовали Crowdcast для проведения вебинаров, поэтому решили рассмотреть его и для онлайн-конференции. В числе прочего здесь есть интересная функция модерация контента можно задавать правила, по которым определенные сообщения в чате будут забанены.
Главный недостаток был почти такой же, как у BigMarker лимит в шесть часов на онлайн-стриминг. LocFromHome идёт 12 часов нон-стоп, поэтому Crowdcast не подходил.
При подготовке LocFromHome 10 февраля 2021 года Hopin рассматривали очень серьёзно. Система была абсолютным фаворитом. Она объединяет в себе и функции, которые есть у конкурентов, и собственные удобные фичи:
интеграция с email-системами пользователям можно отправлять письма о мероприятии;
система позволяет принять до 100 тысяч зрителей;
использование предзаписанного контента удобно, когда спикер не может быть онлайн во время мероприятия.
Из минусов Hopin были проблемы с записью и проигрыванием видео после мероприятия. К тому же изображение спикера отображались не полностью: половину экрана занимала презентация. К счастью, сейчас это уже починили.
Осталась другая проблема. Перед LocFromHome мы проводили ряд репетиций прогоняли выступления со спикерами и проходили с ними авторизацию в Hopin. И некоторые из выступающих подключиться к конференции не смогли. В Smartcat решили не рисковать и вернулись к Zoom.
В итоге все конференции LocFromHome прошли в Zoom. Ничего удивительного инструмент стал стандартом де-факто для онлайн-мероприятий (33 тысячи отзывов на G2). Ещё одним плюсом было то, что большинство участников конференции уже работали с программой в период удаленки, а значит, им было проще разобраться с интерфейсом.
Полезные функции Zoom:
возможность подключения по телефону;
проведение опросов повышают вовлеченность;
whiteboarding спикер может набросать что-то на виртуальной доске.
Но не все идеально в системе ограниченные возможности по интеграции со сторонними приложениями. Это усложняет экспорт контактов в CRM или email-системы, так что продолжить общение со зрителями после мероприятия будет непросто.
В итоге остановились на Zoom. Эта платформа позволяет принять большое количество зрителей, записывать мероприятия, собирать статистику и стоит не как чугунный мост благодаря месячной подписке. Это важно для тех, у кого мероприятия не основной вид деятельности и проходят пару раз в год.
Вместе с тем в Zoom так и не получилось решить проблему вовлеченности пользователей, поэтому сейчас Smartcat думает о построении собственной платформы для LocFromHome. Например, такой, как смастерили WN Expo:
Это позволит наладить все нужные интеграции, повысить вовлеченность и сохранить контакт со зрителями даже после завершения конференции.
Если вы хотите создать своё собственное онлайн-мероприятие, советую пробовать разные подходы. Возможностей сейчас масса. Смотрите, какие инструменты и платформы есть на рынке, комбинируйте их между собой, пробуйте. Держите руку на пульсе и будьте в курсе всех новшеств ивент-индустрии и всё обязательно получится.
Пандемия COVID-19 стала катализатором для новых полезных сервисов. Например, Zoom стал настолько успешным, что по стоимости обогнал в этом месяце IBM. Нас вдохновил этот пример, и мы решили пойти еще дальше: а что если онлайн-конференции реализовать на приставках и Smart TV, чтобы общаться не только по работе, но устраивать удаленные посиделки на диване с друзьями? Но ведь тогда можно на футболе вместе покричать, и кино посмотреть или спортом заняться под контролем тренера.
Почему-то у операторов цифрового ТВ такой услуги не оказалось, хотя с инженерной точки зрения все эти функции вполне можно реализовать на ТВ-приставках на базе Linux/Android и RDK. Мы это проверили на практике и вот теперь делимся с читателями Хабра своим рецептом создания аналога Zoom и видеоконференций через Smart TV. Разберем архитектуру решения и кодирование видеопотока с использованием GStreamer. Информацию для работы с этим фреймворком мы собирали по крупицам, но оно того стоило.
При разработке архитектуры приложений для ТВ-приставок важно учитывать потенциальные ограничения программной и аппаратной части этих устройств. Те, кто создает desktop-программы, как правило, не сталкиваются с этими сложностями, а для embedded-разработчиков это обычное дело.
Итак, с чем мы столкнемся на ТВ-приставках:
Ограниченность ресурсов процессоров и самих приставок. Чаще всего в STB-устройствах используются разнообразные ARM-процессоры, они несут в себя ряд ограничений и дополнительных задач, в частности необходимость использования аппаратного кодирования/декодирование видеопотока. Всегда нужно учитывать, что быстродействие одно из узких мест.
Разность архитектур в приставках разных производителей. Некоторые базируются на Android, другие на RDK, третьи на дистрибутивах на базе Linux со своими ограничениями и нюансами. Поэтому на старте разработки лучше выбрать наиболее общие и кроссплатформенные решения в разных модулях программы. Уже не говоря о поддержке desktop-версии. А уже потом переходить к частным случаям.
Сетевые ограничения. Многие приставки работают как по Ethernet так и по wifi. Сжатие и передача видео/аудиопотока еще одно узкое место в приложениях такого рода.
Безопасность передачи потока и др. вопросы безопасности данных.
Поддержка камер и микрофонов на встроенных платформах.
Теперь можно разложить по полочкам и саму архитектуру. Аналог Zoom для ТВ-приставок будет состоять из нескольких больших компонентов и модулей:
Захват видеопотока
Захват аудиопотока
Сетевой модуль
Модуль кодирования видео/аудиопотока
Модуль декодирования видео/аудиопотока
Вывод видеоконференции на экран
Вывод звука
Цветовые преобразования
Несколько других второстепенных компонентов
В упрощенном виде один из вариантов архитектуры можно изобразить так:
Архитектура приложения для видеоконференций через Smart TVВ рамках статьи мы сфокусируемся на кодировании декодирования видеопотока и на возможной реализации с использованием фреймворка GStreamer, т.к. это один из ключевых моментов в разработке приложений для видеоконференций.
Как мы уже отметили, одним из узких мест является передача видеопотока. Предположим у вас есть камера, отдающие кадры на скорости 30 кадров с секунду на небольшом разрешении 640x480. Итого, в RGB24 получается:
640 х 480 х 3 х 30 = 27 648 000 байт в секунду, т.е. более 26 Мбайт в секунду, что по понятным причинам совершенно неприемлемо в рамках сетевой передачи.
Один из вариантов решения реализовать кодирование какой-нибудь библиотекой. И тут, как можно уже было догадаться из названия статьи, выбор пал на фреймворк GStreamer. Почему именно эта библиотека? Вот несколько ее преимуществ на фоне остальных решений:
Хорошая кроссплатформенность и отличная поддержка Linux и Android.
На RDK Gstreamer является стандартом кодирования/декодирования и включен в дистрибутив по-умолчанию.
Поддержках широкого набора модулей, фильтров и кодеков. Тот же FFmpeg, который можно использовать для тех же целей, де-факто является лишь одним из модулей GStreamerа.
Простота построения конвейера (pipeline). Выстроить цепочку кодирования/декодирования не составляет большого труда, а сам подход конвейера позволяет легко заменять кодеки, фильтры и прочее без лишнего переписывания кода.
API для работы С/C++ идет комплекте.
Поддержка аппаратных кодеров/декодеров, в частности OpenMAX API что крайне важно при работе с ТВ-приставками.
Прежде чем приступать к рассмотрению кода, давайте разберемся с тем, что можно делать пока и без него. В состав GStreamer входят полезные утилиты для работы, в частности:
gst-inspect-1.0 позволит посмотреть список доступных кодеков и модулей, так что можно сразу увидеть, что будет работать, и выбрать набор фильтров и кодеков.
gst-launch-1.0 позволяет запустить любой конвейер (pipeline).
В GStreamer используется схема декодирования, по которой поток последовательно проходит через разные компоненты, начиная с source, заканчивая sink-выводом. При этом source может быть любым файл, устройство, для вывода (sink) также можно указать нужное файл, экран, сетевые выводы и протоколы (наподобие RTP).
Подробнее про использование утилит и принцип построения конвейера можно почитать в другой статье на Хабре. Классический пример проигрывания mp4-файла:
gst-launch-1.0 filesrc location=file.mp4 ! qtdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
На входе принимается mp4-файл, который проходит через демуксер mp4 qtdemux, парсер h264, затем через декодер, конвертер и, наконец, идет вывод на экран.
Можно заменить autovideosink на filesink с параметром файла и вывести декодированный поток прямиком в файл.
Теперь, когда мы разобрались немного с использованием gst-launch-1.0, проделаем все тоже самое, только уже в рамках приложения. Принцип останется тем же: мы встраиваем декодирующий конвейер (pipeline), однако уже с использованием библиотеки GStreamer и glib-событий.
О простейшем примере построения filesrc в filesink с кодом хорошо рассказано в другой хабрастатье GStreamer: элементы и контейнеры. Мы же рассмотрим чуть более реалистичный и сложный живой пример H264-декодирования.
Инициализация GStreamer-приложения происходит один раз при помощи
gstinit (NULL, NULL);
Если вы хотите сразу видеть происходящее в деталях, можно выстроить уровень логирования перед инициализацией
gst_debug_set_active(TRUE);gst_debug_set_default_threshold(GST_LEVEL_LOG);
Учтите: сколько бы у вас не было конвейеров в приложении, инициализировать gstinit достаточно один раз.
Создадим новый event-loop, в котором будут обрабатываться события:
GMainLoop *loop;loop = g_main_loop_new (NULL, FALSE);
И теперь можно начать выстраивать наш конвейер:
Объявим необходимые элементы, в частности сам конвейер как тип GstElement:
GstElement *pipeline, *source, *demuxer, *parser, *decoder, *conv, *sink;pipeline = gst_pipeline_new ("video-decoder");source = gst_element_factory_make ("filesrc", "file-source");demuxer = gst_element_factory_make ("qtdemux", "h264-demuxer");parser = gst_element_factory_make ("h264parse", "h264-parser");decoder = gst_element_factory_make ("avdec_h264", "h264-decoder");conv = gst_element_factory_make ("videoconvert", "converter");sink = gst_element_factory_make ("appsink", "video-output");
Каждый элемент конвейера создается через gst_element_factory_make, где первым параметром идет тип, а вторым его условное название для GStreamer, на которое он впоследствии будет опираться, например при выдаче ошибок.
Также не мешало бы проверить, что все компоненты найдены, в противном случае gst_element_factory_make, возвращает NULL.
if (!pipeline || !source || !demuxer || !parser || !decoder || !conv || !sink) {// не инициализирован один элемент - остановкаreturn;}
Установим тот самый параметр location через gob_ject_set:
gob_ject_set (G_OBJECT (source), "location", argv[1],
NULL);
Остальные параметры в других элементах можно выставлять аналогичным образом.
Теперь необходим обработчик сообщений GStreamer, создадим соответствующий bus_call:
GstBus *bus;guint bus_watch_id;bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);gst_object_unref (bus);
gst_object_unref и другие подобные вызовы нужны для очищения выделенных объектов.
Затем объявим сам обработчик сообщений:
static gbooleanbus_call (GstBus *bus, GstMessage *msg, gpointer data){ GMainLoop *loop = (GMainLoop *) data; switch (GST_MESSAGE_TYPE (msg)) { case GST_MESSAGE_EOS: LOGI ("End of stream\n"); g_main_loop_quit (loop); break; case GST_MESSAGE_ERROR: { gchar *debug; GError *error; gst_message_parse_error (msg, &error, &debug); g_free (debug); LOGE ("Error: %s\n", error->message); g_error_free (error); g_main_loop_quit (loop); break; } default: break; } return TRUE;}
А теперь самое важное: собираем и добавляем все созданные элементы в единый конвейер, тот самый что выстраивали через gst-launch. Очередность добавления, естественно, важна:
gst_bin_add_many (GST_BIN (pipeline), source, demuxer, parser, decoder, conv, sink, NULL);gst_element_link_many (source, demuxer, parser, decoder, conv, sink, NULL);
Стоит также заметить, что такой подход линковки элементов прекрасно работает для потоковых выходов, но в случае именно проигрывания (autovideosink) необходима дополнительная синхронизация и динамическая линковка демуксера и парсера:
gst_element_link (source, demuxer); gst_element_link_many (parser, decoder, conv, sink, NULL); g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), parser);static voidon_pad_added (GstElement *element, GstPad *pad, gpointer data){ GstPad *sinkpad; GstElement *decoder = (GstElement *) data; /* We can now link this pad with the sink pad */ g_print ("Dynamic pad created, linking demuxer/decoder\n"); sinkpad = gst_element_get_static_pad (decoder, "sink"); gst_pad_link (pad, sinkpad); gst_object_unref (sinkpad);}
Динамическое соединение дает возможность определения типа и количества потоков в отличии от статического, и будет работать в некоторых случаях когда это требуется.
Ну и, наконец, переводим состояние конвейера в проигрывание:
gst_element_set_state (pipeline,
GST_STATE_PLAYING);
И запускаем event-loop:
g_main_loop_run (loop);
После окончания этой процедуры все нужно почистить:
gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (GST_OBJECT (pipeline)); g_source_remove (bus_watch_id); g_main_loop_unref (loop);
Стоит еще рассказать о полезных, но не особо упомянутых вещах в документации о том, как можно легко организовать фоллбэк декодеров или энкодеров.
Поможет нам в этом функция gst_element_factory_find, которая проверяет, есть ли у нас кодек в factory элементов:
if(gst_element_factory_find("omxh264dec"))decoder = gst_element_factory_make ("omxh264dec", "h264-decoder");elsedecoder = gst_element_factory_make ("avdec_h264", "h264-decoder");
В данном примере мы приоритезировали выбор аппаратного декорера OMX на платформе RDK, и в случае его отсутствия будем выбирать программную реализацию.
Другой крайне полезной, но еще более редко используемой функцией является проверка того, что же мы на самом деле инициализировали в GstElement (какой кодек):
gst_plugin_feature_get_name(gst_element_get_factory(encoder))
Можно проделать это таким незамысловатым способом и вернуть название инициализированного кодека.
Не стоит оставлять без внимания и цветовые модели, раз уж мы заговорили о кодировании видео с камер. И тут чаще подразумевается YUV, нежели RGB.
Камеры просто обожают цветовую модель YUYV. Но это то, с чем любит работать GStreamer, для него более привычна модель I420. На выходе, если речь не идет о выводе в gl-фрейм, у нас также будут выходить I420-кадры. Будьте готовы подставить необходимые фильтры и выполнить преобразования. Некоторые энкодеры умеют работать и с другими цветовыми моделями, но чаще это исключения из правил.
Еще стоит заметить что у GStreamerа есть свой модуль получения видеопотока с камеры, и его можно использовать для построения конвейера, но об этом расскажем как-нибудь в другой раз.
Пришло время разобраться с потоками данных. До этого момента мы просто кодировали то, что есть в файле, через filesrc и выводили все в тот же filesink или на экран.
Теперь будем работать с буферами и входами и выходами appsrc / appsink. Почему-то этому вопросу почти не уделиливнимания в официальной документации.
Как же организовать постоянный поток данных в созданных конвейерах, а точнее подать буфер на выход и получить кодированный или декодированный буфер выхода? Допустим мы получили картинку с камеры, и нам нужно ее закодировать. Мы уже определились с тем, что нам потребуется фрейм в I420. Допустим он у нас есть, что дальше? Как пропустить картинку через весь поток конвейера?
Вначале установим обработчик события need-data, который будет запускаться при необходимости подачи данных в конвейер и начнем подавать входной буфер:
g_signal_connect (source, "need-data", G_CALLBACK (encoder_cb_need_data), NULL);
Сам обработчик имеет следующий вид:
encoder_cb_need_data (GstElement *appsrc, guint unused_size, gpointer user_data){ GstBuffer *buffer; GstFlowReturn ret; GstMapInfo map; int size; uint8_t* image; // get image buffer = gst_buffer_new_allocate (NULL, size, NULL); gst_buffer_map (buffer, &map, GST_MAP_WRITE); memcpy((guchar *)map.data, image, gst_buffer_get_size( buffer ) ); gst_buffer_unmap(buffer, &map); g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret); gst_buffer_unref(buffer);}
image это, условно говоря, псевдокод буфера картинки в I420.
Далее мы создаем через gst_buffer_new_allocate буфер необходимого размера, который будет соответствовать размеру буфера картинки.
При помощи gst_buffer_map устанавливаем буфер в режим записи и, используя memcpy, копируем нашу картинку в созданный буфер.
И, наконец, сигнализируем GStreamу о том, что буфер готов.
Ремарка: очень важно после записи использовать gst_buffer_unmap, а также очищать буфер после использования при помощи gst_buffer_unref. Иначе будет утечка памяти. В скудном количестве доступных примеров никто особо насчет вопроса освобождения памяти не заморачивался, а он, понятное дело, важный.
Теперь, когда мы закончили с обработчиком, нужно проделать еще одну вещь: настроить caps на поступление ожидаемого формата.
Делается это перед установкой обработчика сигнала need-data:
g_object_set (G_OBJECT (source), "stream-type", 0, "format", GST_FORMAT_TIME, NULL);g_object_set (G_OBJECT (source), "caps",gst_caps_new_simple ("video/x-raw","format", G_TYPE_STRING, "I420","width", G_TYPE_INT, 640,"height", G_TYPE_INT, 480,"framerate", GST_TYPE_FRACTION, 30, 1,NULL), NULL);
Как и все параметры GstElement, установка параметров осуществляется через g_object_set.
В данном случае мы задали тип потока, и его caps формат данных. Указав, что на выход appsrc будет поступать данные I420 c разрешением 640x480 и частотой 30 кадров в секунду.
Частота в нашем случае, да в целом, не играет роли. На практике мы не замечали, чтобы GStreamer как-то ограничивал вызовы need-data по частоте.
Готово, теперь наши кадры поступают в энкодер.
А теперь разберемся, как получить кодированный поток на выходе.
Подключаем обработчик к sink pad:
GstPad *pad = gst_element_get_static_pad (sink, "sink"); gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, encoder_cb_have_data, NULL, NULL); gst_object_unref (pad);
Похожим образом мы подключились к другому событию sink pad GST_PAD_PROBE_TYPE_BUFFER, которое будет вызываться по мере поступления буфера данных в sink pad.
static GstPadProbeReturnencoder_cb_have_data (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) { GstBuffer *buf = gst_pad_probe_info_get_buffer (info); GstMemory *bufMem = gst_buffer_get_memory(buf, 0); GstMapInfo bufInfo; gst_memory_map(bufMem, &bufInfo, GST_MAP_READ); // bufInfo.data, bufInfo.size gst_memory_unmap(bufMem, &bufInfo); return GST_PAD_PROBE_OK;}
Колбэк имеет похожую структуру. Теперь нужно достучаться до памяти буфера. Вначале получаем GstBuffer, затем указатель его памяти, используя gst_buffer_get_memory по индексу 0 (как правило задействован только он). И, наконец, используя gst_memory_map, получаем адрес буфера данных bufInfo.data и его размер bufInfo.size.
Фактически мы добились цели получили буфер с кодированными данными и его размер.
Итак, мы рассмотрели ключевые и самые интересные компоненты из приложения для Smart TV аналога Zoom для ТВ-приставок: архитектуру, модули кодирования / декодирования через GStreamer, буферы ввода / вывода и используемые цветовые преобразования.
Для операторов цифрового ТВ такая программная платформа может стать новым абонентским сервисом. Для нас инженеров новым интересным embedded-проектом для реализации на разных приставках на базе RDK, Linux и Android. А для всех остальных возможностью приятно проводить время за совместным просмотром фильмов и спортивных матчей, занятий спортом и посиделок с близкими в период карантина или удаленной работы.
Эту идею с сервисом видеоконференций по Smart TV можно развивать и дальше, как с точки зрения инженерных решений, так и по сценариям их использования. Так что делитесь мыслями в комментариях.
оффлайн = онлайн + очное обучение
Возможно, что мы наконец (наконец!) начинаем видеть крохотный лучик света в конце тёмного тоннеля этой затяжной утомительной пандемии. Но увы, это совсем не говорит о том, что приближается конец эпохи презентаций и переговоров в Zoom.
В 2010 году Билл Гейтс правильно предсказал, что нас всех ждёт пандемия.
А сейчас он предполагает, что мы никогда не вернёмся к тому формату работы, как это было раньше. Меняющиеся ожидания и непрерывное совершенствование программного обеспечения вполне способны сделать так, что многие удалённые встречи и мероприятия останутся с нами навсегда. С этим утверждением согласны и многие другие эксперты.
Поэтому несмотря на то, что вы измотаны постоянными диалогами с экраном компьютера в течение дня, всё равно нужно убедиться, что вы хороши в этом. Умение увлекательно и убедительно презентовать себя и свою идею на видео это важнейший карьерный навык будущего.
Это делает недавний пост Брайары Голдберг коуча по подготовке спикеров, выступающих на конференциях TED бесценным. В нём она описывает наиболее распространённые ошибки, которые она всё ещё наблюдает, когда люди выступают в Zoom, и предлагает простые и полезные советы, чтобы исправить их.
Смотреть на людей, с которыми вы общаетесь, конечно, совершенно естественно. Но одновременно с этим, когда ваша речь должна быть убедительной и вдохновляющей это просто катастрофа. Из-за расположения камеры вы в конечном итоге смотрите на какую-то случайную точку сбоку от вашей аудитории, но никак не на неё.
Единственный способ установить зрительный контакт с вашими виртуальными слушателями это смотреть прямо в объектив вашей камеры. Поверьте мне: поначалу это будет действительно странно. соглашается Голдберг, - но если хотите, чтобы ваша аудитория оставалась внимательной и вовлечённой, вам придётся пожертвовать своим желанием посмотреть на их лица.
Стремитесь смотреть на этот маленький кружок в верхней части вашего ноутбука (или в другое место, смотря, где в вашем устройстве находится объектив) в течение полных 90% времени вашей презентации.
Когда дело доходит до презентаций и подготовке к ним, вы стремитесь найти компромисс: вы не хотите записывать всё и читать как робот, но вы также не хотите спотыкаться на каждом слове, сопровождая звуками гм и ах весь свой материал. Уважайте время своей аудитории, практикуясь немного заранее, советует Голдберг.
То, что вы можете превратить свой ноутбук в телесуфлёр, совсем не означает, что вы должны это делать, - подчёркивает она.
Может ли взгляд на бесконечные отражения бестелесных голов отвлекать и вызывать стресс? Да, конечно может. Но Голдберг указывает, что, если вы позволите всей аудитории выключить свое видео, вы также не будете иметь ни малейшего представления о том, как проходит ваша презентация.
Спикеру, выступающему онлайн, часто невозможно узнать, слушает ли его аудитория, когда он их не видит! Поэтому в Zoom на 100% уместно попросить аудиторию включить свои камеры. А если вы хотите быть очень вежливыми, отправьте уведомление с просьбой о присутствии с включенной камерой заранее. Таким образом, ваша аудитория сможет это спланировать! - советует она.
Среди безумных месяцев заточения в онлайне, связанных с коронавирусом, я нашла светлый лучик в Twitter - Room Rater. Если вы еще не знакомы с этим веселым аккаунтом, то поясню: там оценивается обстановка за различными спикерами по шкале от 1 до 10. Естественно, эти оценки сопровождаются едкими замечаниями и советами по улучшению.
Какой в этом всём смысл? Может нужно быть более продуктивным и перестать отвлекаться на бессмысленные (хоть и забавные) твиты?
Нет, посыл в следующем: мы вошли в новую эпоху жизни на удалёнке, где внезапно люди обращают чрезмерное внимание на то, что происходит позади нас в Zoom. И это важно не только для язвительных шутников из социальных сетей, но это также важно и для тех, кто хочет произвести сильное впечатление на аудиторию. В подтверждение данному тезису вышло исследование фирмы Quantified Communications, занимающейся изучением и усовершенствованием коммуникативных навыков.
В недавнем обзоре на Harvard Business Review соучредитель фирмы Ноа Зандан и директор по взаимодействию Хэлли Линч объясняют, что ровно как и наш внешний вид, так и фон во время видеоконференций имеют огромное значение. Опрос 500 профессионалов, использующих удаленный формат работы, по поводу эстетики видеозвонков дал неожиданные результаты - респонденты имеют твёрдые убеждения на этот счёт.
Например, мужчины чаще выбирают книжные стеллажи в качестве фона чем женщины. И, похоже, многим нравится стиль бизнес-кэжуал для видеозвонков, касающихся работы. На самом деле, исследование содержит множество забавных мелочей. Но среди интересных деталей наглядно вырисовывалось одно понятное и последовательное предпочтение: вам определенно следует отказаться от забавного или слишком креативного фона в Zoom.
Когда дело дошло до обсуждения фона, самым популярным выбором было показать реальную комнату за спикером, - пишут авторы исследования. Если вы стремитесь к подлинности, надежности или опыту, пустая стена или виртуальный живописный фон не несут в себе ничего серьезного и искреннего. Вместо этого выберите комнату, в которой вы находитесь. Или в идеале замкнутое пространство. И обязательно подумайте, что находится на стене позади вас.
Единственным исключением были только те случаи, где спикеру нужно было передать своё творчество. Здесь можно использовать свой естественный декор комнаты, но даже в этом случае следует избегать виртуального фона.
По всем исследуемым направлениям виртуальные фоны набрали в среднем всего 7,5% голосов, что говорит о том, что их следует сохранить до следующего виртуального свидания, а не для следующей рабочей встречи, - заключает пост.
Мы в ITSOFT были за прямолинейность, открытость и против "официоза" еще до пандемии. На встречах не требовался особый стиль или дресс-код, а сами они могли проходить за пределами переговорок: в парке или кафе. Потому при переходе на удаленку никто не использовал фоны, фильтры или белые стены в Zoom, ведь можно быть собой и никто не осудит.
Суть вышеизложенного в том, что если вы хотите, чтобы вас воспринимали всерьёз, именно вы должны быть тем ярким и интересным элементом на картинке в Zoom. Фон - лишь тесное обрамление личности и профессионала своего дела. Он не должен мешать вовлеченности и вниманию аудитории. Равно как и небольшие коммуникативные пробелы виртуального спикера.
Поэтому выбираем помещение, усаживаемся поудобнее, прогоняем презентацию, смотрим в камеру и только потом должна прозвучать фраза: Здравствуйте, сегодня наша тема для обсуждения. Помните, второго дубля уже не будет.
Казалось бы, до марта 2020 года мало кто вообще в России слышал о сервисе видеоконференций с названием ZOOM. Зато теперь о нем говорит каждый второй, даже несмотря на слухи о проблемах с безопасностью личных данных. Ни у кого нет внятного объяснения того, почему этот сервис стал столь популярным в мгновение ока. С другой стороны, ответ очевиден: эпидемия коронавируса заставила бесчисленное количество людей работать из дома, а удаленным сотрудникам нужен инструмент для проведения видеооконференций. Однако еще задолго до того, как удаленная работа стала мейнстримом, люди тоже пользовались ZOOMом и предпочитали его большинству приложениям для видеосвязи. Так что вопрос почему люди выбирают ZOOM? по-прежнему актуален. Давайте разбираться, почему так?
К настоящему времени история ZOOM больше мифологична и вызывает много вопросов, а потому начнем с самого начала. В 2011 году Эрик Юань, ведущий инженер подразделения WebEx в компании Cisco, уволился с работы и решил создать собственный бизнес. Он набрал команду, собрал первые инвестиции, а два года спустя появился проект ZOOM. Проект собирает еще больше денег от инвесторов и Эрик начинает сразу же использовать сервис для проведения деловых встреч с новыми инвесторами, осуществляя демонстрацию возможностей программы на практике. Что ж это сыграло ему на руку: к 2015 году проект привлек 30 миллионов долларов, а к 2017 году его стоимость оценивалась в 1 миллиард.
Все ли было так гладко? Нет. Давайте перенесемся на несколько лет вперед. Первая проблема сервиса вскрылась в 2018 году, когдабыла обнаружена уязвимость, позволявшая неавторизованным пользователям внедряться в конференции и подделывать сообщения участников собрания, а также удалять пользователей из беседы. Весной 2019 года специалисты по безопасности обнаружили в приложении ZOOM для MacOS еще одну дыру, которая позволяла вредоносным сайтам насильно добавлять пользователей в конференцию и активировать их веб-камеру. Эта проблема затронула даже тех пользователей, который удалили ZOOM со своего Макинтоша, что вынудило Apple выпустить патч безопасности. ZOOM в свою очередь изменил способ предоставления разрешений для подключения к конференциям.
Впрочем, эта ситуация не повлияла на позиции ZOOM, сделав его к концу 2019 года одним из самых популярных бизнес-инструментов, а также самым быстрорастущим. В начале марта 2020 года прирост новых клиентов составил 61%, а выручка компании выросла на 88% по сравнению с 2019 годом. К концу марта 2020 года ZOOM даже обогнал TikTok по количеству скачиваний в AppStore. А затем случился громкий скандал с утечкой пользовательских данных. Тот неловкий момент, когда популярность совсем не играет на руку: 4 апреля 2020 года СМИ сообщили, что тысячи личных видео из ZOOM были выложены в Сеть для открытого просмотра и обвинили компанию в безалаберном отношении к конфеденциальности своих пользователей. Спору нет, ведь в эпоху самоизоляции многие люди перенесли в формат видеозвонков даже личные взаимодействия.
Как оказалось, среди обнародованных видеороликов обнаружили сеансы психотерапии, телемедицинские звонки с контактными данными пациентов, бизнес-встречи, в которых фигурировала финансовая отчетность компаний. Понятное дело, что вместе с этими материалами были раскрыты лица людей и их голоса. Согласитесь, история не из приятных. Видео ZOOM не записываются по умолчанию, но организаторы вызовов могут выбрать их запись и сохранить на серверах Zoom или своих компьютерах без согласия участников, хотя участники получают уведомление, когда хост начинает запись. В этом многие пользователи ZOOM видят главную проблему сервиса, хотя то же самое можно сделать в любом приложении, используя видеозахват экрана.
Обнаружение того, что видео доступны в открытой сети, добавляет ряд проблем, которые привлекли общественное внимание, поскольку услуга стала предпочтительной альтернативой для американской работы, школы и социальной жизни. Комментируя данную ситуацию представители ZOOM сказали, что сервис предоставляет хостам безопасный и надежный способ хранения записей, а также инструкции о том, как пользователи могут повысить безопасность своих вызовов. Если организаторы собраний решат выложить запись в общий доступ мы настоятельно призываем их быть бдительными и предельно осторожными, а также проявлять прозрачность по отношению к участникам беседы, уведомляя их о публикации видео в общий доступ. Ну, то бишь, просто сказали, что мы, мол ни при чем, вы сами во всем виноваты.
Однако позже Эрик Юань принес извинения за то, что ZOOM не соответствует ожиданиям пользователей в отношении конфиденциальности и безопасности, и заявил, что компания перенаправит своих инженеров на устранение недостатков безопасности. Также Эрик опубликовал в своем блоге запись о том, что сервис ZOOM используется гораздо шире, чем он предполагал, когда основал компанию в 2011 году. Мы не разрабатывали продукт с предвидением, что в течение нескольких недель каждый человек в мире вдруг начнет работать, учиться и общаться дома, написал Эрик в качестве оправдания. По его словам, новые пользователи видеосервиса начали использовать ZOOM неожиданными способами, которые поставили перед компанией проблемы, с которыми никто не ожидал столкнуться при создании платформы. Честно говоря, очень странно, что разработчики приложения действительно не подумали заранее о том, что люди начнут сливать видеозаписи и просто записи разговоров в Интернет.
Многие пользователи ZOOM после этого случая высказали, что сервис видеоконференций может лучше предупредить людей о необходимости защитить свои видео. А эксперты по безопасности предложили ZOOM внедрить новый алгоритм присвоения имен к видеозаписям, чтобы их было труднее найти в поисковых системах (дело в том, что некоторые поисковые системы осуществляют поиск по открытым облачным хранилищам). Дело в том, что при разработке своего сервиса инженеры ZOOM обошли некоторые общие функции безопасности других программ видеочата, такие как требование, чтобы при сохранении видеозаписи использовались уникальные имена файлов.
По мере того, как миллионы людей выбирают ZOOM, эксперты по безопасности отмечают, что проблемы с программным обеспечением и конфиденциальностью, которые их волнуют, могут подвергнуть опасности и компьютеры людей. В частности, специалисты высказали предположение, что бреши системе безопасности ZOOM могут позволить незнакомцам украсть информацию о входе в систему, просмотреть сообщения и взять под контроль камеры и микрофоны пользователей.
Особенно встревоженными оказались представители сексуальных меньшинств. Рут Шварц, директор компании Conscious Girlfriend (группа поддержки отношений для однополых отношений между женщинами) ужаснулась, когда узнала, что видеозаписи ее групповых сессий можно просматривать через Интернет. По ее мнению, женщины с нетрадиционной ориентацией и без того постоянно подвергаются нападкам, но из-за небезопасного ZOOM это может усугубить их положение в обществе. Это действительно важный звонок для всех, ведь социальная связь является одним из главных факторов, определяющих психическое и физическое здоровье. Для всех нас, кто выполняет такую деликатную работу, необходимы максимальные меры предосторожности для защиты наших сообществ. Очень жаль, что ZOOM позволяет себе пренебрегать этим.
Несмотря на явные проблемы с безопасностью, люди все равно продолжают делать выбор в пользу ZOOM, а не сторонних сервисов конкурентов. Почему так происходит? Пользователи сервиса рассказывают, что основная причина, по которой они любят ZOOM, кроется в том, что максимальная задержка во время разговора не превышает 150 мс. Руководство самого ZOOM отмечает, что людям нравится их приложение просто потому, что это работает: никому не приходится лишний раз убеждаться, что все пользователи, подключившиеся к собранию, могут хорошо слышать каждого оратора. Кроме того, приложение эффективно функционирует на мобильном телефоне и позволяет удобно производить демонстрацию экрана для всех участников беседы.
Вы скажете, что даже майкрософтовский Skype умеет делать тоже самое безо всяких танцев с бубном, и будете совершенно правы. А значит, одной лишь функциональности недостаточно для того, чтобы быть лидером рынка. Именно поэтому мы начали разговор с низкой задержки, которая не позволяет допускать рассинхрона между видео и звуком. ZOOM постоянно сравнивается скептиками с такими сервисами, как Skype и Hangouts (последний не популярен в России), которые предлагают аналогичные наборы инструментов для совершения видеосессий и общения, но в подавляющем большинстве люди все равно выбирают ZOOM.
Каким-то образом в нашем огромном мире ZOOM стал эдаким золотым стандартом. Рич Костелло, аналитик компании IDC, отмечает: У создателей ZOOM есть отличный продукт и отличные маркетологи, которые отлично справляются с продвижением продукта на рынке. Сейчас многие из конкурентов ZOOM пытаются понять, что же конкретно сделал рекламный отдел компании, чтобы добиться столь широкого успеха программы.
Поскольку ZOOM продолжает дистанцироваться от толпы видеочатов, преображение мира в формате перехода на удаленную работу, приносит только пользу создателям видеосервиса. Бесспорно коронавирус увеличил число людей, которые перешли на работу из дома: примерно 4,7 миллионов жителей США и почти 6 миллионов жителей России перевели на удаленку с февраля 2020 года. Для этих людей ZOOM это больше, чем просто возможность проводить видеоконференции. ZOOM это теперь и есть офис. Более 10 миллионов человек присоединяются к встрече Zoom каждый день. А еще в феврале 2020 года компания достигла более 200 миллионов ежедневных пользователей по сравнению с 10 миллионами в декабре 2019 года.
С распространением коронавируса, амбиции руководителей ZOOM раскачались еще больше. У них родилась мысль, что можно сделать нечто большее, чем просто сервис видеоконференций, ведь ZOOM может изменить способ развития бизнеса в будущем. И эпидемия стала отличным полем для тест-драйва.
Сейчас разработчики ZOOM запускают новые коммуникационные инструменты для замены стационарных офисных телефонов и мессенджеров, новые функции искусственного интеллекта, разработанные для повышения эффективности совещаний, а еще разрабатывают способы использования передовых технологий, позволяющих сотрудникам чувствовать себя ближе друг к другу. В данном случае речь идет об обкатке VR-возможностей, которые вполне могут появиться в ZOOMе. Иначе говоря, пока другие компании хотят переосмыслить офис, как непосредственно рабочее место, специалисты из ZOOM хотят переосмыслить офис как место вообще.
Мы хотим быть коммуникационной компанией номер один, рассказывают они. Под этим подразумевается превращение сервиса видеоконференций в мощную платформу для текстовых чатов, интеграцию с календарными приложениями, телефонными контактами, трекерами продаж, образовательными платформами и многое другое. Кажется, на выходе мы получим продвинутую версию китайского WeChat для европейцев. Глобальный план ZOOM начинается с видео, а заканчивается всеобъемлющим инструментом коммуникации для всей рабочей силы. Но, конечно же, нет никакой гарантии, что успех ZOOM в видеосреде переместится в другое место, отмечает Рич Костелло из IDC.
С точки зрения продукта задача ZOOM будет заключаться в том, чтобы предлагать гораздо больше опций и возможностей, не теряя при этом простоты работы, которую любят пользователи. Успешные приложения, как правило, всегда пытаются добавить больше функций, что делает их менее полезными и разочаровывает людей, заставляя искать более удобное и простое решение. Эрик Юань знает это не понаслышке после своей истории с WebEx, поэтому ZOOM будет предлагать лишь возможность активации новых опций, не заставляя пользователей пробовать новые возможности принудительно. Если вы подключите какую-то опцию осознанно, то будете понимать, как ее использовать, рассказывает Юань, Однако самый важный способ сделать пользователей счастливыми убедиться, что видео продолжает работать.
Читайте обзоры, аналитику рынков и инвестидеи в Telegram-канале ITI Capital
В нашем блоге мы уже неоднократно писали о компаниях, которым глобальная пандемия коронавируса сыграла на руку. Один из главных бенефициаров этой ситуации несомненно компания Zoom Video Communications, которая разрабатывает сервис видеоконференций.
Согласно опубликованной ею отчетности за второй квартал, три месяца общемирового карантина позволили ей получить годовую выручку. Акции Zoom тут же взлетели в цене на 25%. Подробности в нашей новой статье.
За период в три месяца выручка Zoom выросла на 355% в формате год к году. Всего она составила $633,5 млн, что на 35% выше ожиданий аналитиков. Продажи за весь 2019 год составили всего $622,7 млн.
Вынужденный переход на удаленный формат работы стимулировал интерес к видеоконференциям. В итоге количество корпоративных клиентов Zoom численностью более 10 человек за год увеличилось на 458%. До тысячи возросло количество клиентов, которые потратили на сервис $100 тысяч и более.
Согласно данным отчета, компания повысила свой прогноз по выручке на текущий финансовый год. Если ранее планировалось выручить $1,781,8 млрд, то теперь Zoom планирует совершить продаж на $2,372,39 млрд.
Популярность облачных сервисов останется на высоком уровне даже после завершения глобального карантина. Однако, существуют и факторы, которые могут ограничить рост Zoom.
Во-первых, основную часть выручки приносят сделки с корпоративными клиентами, тогда как подавляющее большинство пользователей-физлиц работает с бесплатной версией системы. Кроме того, некоторые аналитики считают, что среди ограничивающих факторов есть и такие:
Компания уже переоценена показатель P/E ratio (отношению рыночной стоимости акции к годовой прибыли, полученной на акцию) в случае Zoom уже превышал 6000 еще в начале лета, что очень много.
Конкуренция фундаментально, Zoom не предлагает ничего технологически уникального. Google Hangouts аналогичный продукт, а Facebook выкатил функцию Messenger Rooms с возможностью видеозвонков. Конкуренция со стороны Facebook и Google фактор, который не стоит игнорировать.
Тем не менее, эти риски относятся скорее к долгосрочным. В перспективе же ближайшего времени, вряд ли что-то помешает Zoom показывать очень хорошие результаты.
В России акции американских компаний можно купить на Санкт-Петербургской бирже. Для этого не нужно открывать счет у иностранного брокера или использовать приложения вроде Robinhood, достаточно будет российского счета. Открыть его можно онлайн.
Читайте обзоры, аналитику рынков и инвестидеи в Telegram-канале ITI Capital
2020 оказался годом удаленки. В марте мы всей командой были вынуждены перейти на полностью дистанционный формат работы и все процессы пришлось настраивать заново.
Отдельной болью для нас стали видеозвонки. И началось: Ой, а давайте в Скайпе, Дискорде, Телеграме, Зуме. А потом то девайсы программное обеспечение криво поддерживают, то технические сбои, то аккаунты вне доступа, то обновление софта и еще вагон проблем. Уходила куча времени, чтобы просто связаться и провести совещание.
В общем, уже через месяц подобных экзекуций мы психанули и стали разрабатывать свою собственную систему видеосвязи на базе CRM Мегаплан. Сразу многофункциональную, чтобы запустить ее и для клиентов. С какими трудностями столкнулись, как решали задачу и что из этого получилось читайте в статье.
Буквально за несколько месяцев после начала карантина количество пользователей Zoom увеличилось в 30 раз. В декабре 2019 года ежедневно сервисом пользовались 10 млн людей, а в апреле 2020 уже 300 млн.
Поначалу мы тоже использовали Zoom для общих видеоконференций. Были небольшие проблемы со стабильностью сервиса сервера не выдерживали нагрузок и иногда звонки жутко тормозили неприятно, но ничего критичного. Во всяком случае, мы так думали.
А потом мы узнали о массивной утечке данных. В апреле 2020 хакеры взломали базы данных Zoom и в сеть утекли данные свыше 500 000 аккаунтов. Логины, пароли, email, URL личных чатов, коды администраторов для управления конференциями.
Более того, уязвимости Zoom можно было использовать для получения удаленного доступа к компьютеру и защищенным файлам. Топовый сервис для видеоконференций оказался не просто ненадежным, а даже опасным. Вопрос безопасности встал очень остро. С зумбомбингом мы хоть не встречались, но были наслышаны и о нем.
Насчет удобства использования сторонних сервисов, все также было не очень гладко. При обсуждении рабочих вопросов один на один или малыми группами чаще всего использовали Skype или Facebook Messenger. Для встреч по отделам и общих конференций Zoom. И самым проблемным оказалось отсутствие единой базы записей видеозвонков. Попытка пересмотреть обсуждение какого-нибудь вопроса превращалась в квест.
Со стабильностью все было тоже не очень гладко. В марте у нас была ситуация, когда из-за обновления софта три участника важного видеозвонка просто не смогли подключиться. Танцы с бубном не помогали фактического контроля над внешними зарубежными приложениями нет никакого и нет никакой возможности понять, что не так. В результате через полчаса пришлось переносить встречу на другой день. Время и нервы потрачены, результат нулевой.
Да и в целом организационные моменты подталкивали на разработку своего софта для видеозвонков. С той лишь разницей, что мы видели его не как отдельное решение, а встроенный в нашу CRM видеочат для обсуждения рабочих задач и проектов, уже заведенных в систему. Тем более, что идеи уже были. Нам нужно было добиться стабильной работы на всех ОС и мобильных платформах.
Получить доступ к API и сделать существующие решения удобнее конкретно для нас тоже не вариант. Разработчики либо вообще не давали доступ к API, либо это стоило космические деньги.
В общем, в апреле 2020 года мы серьезно нацелились на разработку многофункциональной платформы видеосвязи, которая покроет не только наши хотелки, но и решит проблемы наших клиентов.
Впервые идея создать собственную платформу видеосвязи появилась у нас в 2015 году.
Мы даже выделили немного времени и разработали тестовую версию сервиса видеосвязи на Flash. Прописали буквально только базовый функционал, так что даже до демо-версии она не дотягивала.
В результате аналитики решили, что допиливать софт до релиза нецелесообразно. В разработку нужно было огромное количество денег, а рентабельность идеи была очень сомнительной. Мы не собирались превращаться в конкурента Skype, а в качестве дополнительной функции CRM вложения в видеосвязь были неоправданно высокими.
Тем более, что тогда еще не было адекватных технологий, с помощью которых можно было все это организовать. Первоначальный вариант на Flash нам не понравился его было невозможно масштабировать, было много вопросов с технической точки зрения, да еще за сервер нужно было платить неплохие деньги.
И хорошо, что мы тогда не стали искать выходы. Было бы печально вложить кучу денег во второстепенную функцию, а через 5 лет узнать, что все нужно делать заново, потому что Flash отключают.
***
Весной 2020 года мы вернулись к идее собственной платформы видеосвязи. Потому что проблемы с организацией рабочего процесса, с которым столкнулись мы не были уникальными. У многих наших клиентов были такие же, а у нас были технические и профессиональные возможности их решить.
Разработка первоначальной версии велась буквально на коленке. Сначала выбрали OpenVidu, который нас максимально устраивал и был доступен в плане лицензии. А затем буквально в течение нескольких недель собрали MVP и попытались интегрировать его в CRM Мегаплана.
Опенсоурсная версия получилась рабочей, но у нее было несколько серьезных проблем:
Продукт получился очень требователен к мощности сервера. Если для внутреннего использования это еще не критично, то для релиза нужны были отдельные серверы для видеосвязи. Коммерческая лицензия позволяла сделать продукт масштабируемым, но тогда все упиралось в стоимость серверов оплата была не за использование фактических возможностей, а за время аренды серверов. Даже если сервер простаивает, за него нужно платить.
Вылез целый ряд багов и проблем, решение которых мы в процессе первичной разработки не нашли. Среди них:
a. Отсутствие записи трансляции. Наши специалисты так и не смогли придумать, как реализовать запись без слишком больших переделок или без использования сторонних утилит;
b. У технологии не было мультиплексирования, поэтому использование видеосвязи слишко быстро сажало аккумуляторы смартфонов. Для ее решения нужны были специализированные хардварные решения, к которым мы были не готовы.
c. В мобильной версии в целом было много багов, для фикса которых нужно было много времени. Самым проблемным оказалось то, что приложение во время звонка вылезает на передний план и свернуть его никак нельзя. Работать со смартфоном во время конференции становилось попросту невозможно.
Мы были привязаны к технической поддержке с третьей стороны. Работа даже над простыми багами могла затягиваться на неопределенно долгое время. Кроме того, у нас не было гарантий, что данные видеосвязи и пользователей не утекут на сторону. Мы работаем с бизнесом, поэтому вопрос безопасности для нас был ключевым.
Стоимость использования OpenVidu считается за одно серверное ядро в минуту. Для небольших решений она приемлема, но это крайне затрудняет масштабирование сервиса все упирается в деньги, много денег.
Количество минусов перекрывало все перспективы использования технологии. Поэтому мы решили от нее отказаться.
Для передачи видеоданных мы используем стандартный протокол WebRTC. Стабильная платформа для видеосвязи, на которой можно реализовать все хотели и свистелки, которые нам нужны.
Но обычного p2p соединения нам недостаточно, ведь нужно было реализовать возможность записи трансляции на сервер. Поэтому решили использовать ретранслятор Janus Gateway.
В целом выбирали между тремя платформами: OpenVidu, которую оставили как контрольный образец, Jitsi и Janus. В результате чтения аналитики выяснили, что OpenVidu сильно проседает по качеству картинки трансляции (как будто и так вопросов было мало), а у Jitsi во время нагрузки качество плавает. Не то, чтобы мы планировали делать конференции из 200-300 пользователей, но стабильность работы видеосвязи для нас ключевой момент.
Janus же наиболее стабилен. Он выдает стабильный битрейт, рационально используя ресурсы процессора. В целом Jitsi и Janus показывают хорошие результаты, но у Jitsi есть порог производительности, выше которого он просто падает. Как поведет себя система с кучей дополнительных фишек и на полной нагрузке, было неясно.
У Janus есть куча полезных фич, которые не реализованы или платные в OpenVidu. К примеру, контроль качества связи и автоматическое выставление битрейта в зависимости от него. Или же поддержка кодеков VP9 и режима симулькаста.
Janus имеет ничтожное влияние на процессор и память сервера. Всё упирается только в пропускную способность сети. Поэтому можно брать не самые мощные сервера, а много маленьких и пару больших для декодирования и склейки записанных видеозвонков. Мы не стали прибегать к сторонним решениям, вроде Janus cloud, где узким местом и точкой входа всё равно является janus-proxy, а сделали балансировку на уровне продукта.
Михаил Пирогов, руководитель отдела эксплуатации и администрирования Мегаплана
С Janus все также получилось не слишком гладко. Для реализации WebRTC используется библиотека React Native WebRTC. У нас нет разработчиков, которые хорошо знают React Native, поэтому чтобы устранить проблемы совместимости протокола с софтом сервера, ушло довольно много времени.
Были сложности и со сборкой. Компилятор Metro bundler хорошо работает в веб-версии, но не подтягивает дополнительные библиотеки в мобильной, из-за чего мобильная версия была нестабильной и падала.
Для мобильной версии также пришлось полностью перерисовывать интерфейс. Стандартный вариант не подходил для маленьких экранов когда количество участников конференции было больше пяти, видео просто не помещались на экран, что вело за собой ошибки отображения трансляции в целом.
Пришлось сильно заморочиться с решением проблемы, разделив потоки на отдельные экраны и оптимизировав рендер и отрисовку видео участников в реальном времени. Кому интересно, можем дать ссылку на код.
Вообще с реализацией мобильных версий на iOS и Android было неожиданно много проблем. Разница на платформах между управлением динамиками и микрофоном, разные принципы переключения на громкую связь и наушники. Пришлось создавать универсальный код, который одинаково работал бы на обеих ОС. Им тоже можем поделиться, если что.
Самой главной головной болью для нас стала проблема пятого человека. Пять человек стабильно могли участвовать в конференции, но как только присоединялся шестой одного выбрасывало из трансляции. С ней тоже удалось справиться.
Альфа-версия видеосвязи нас удовлетворила, поэтому мы выкатили бету. И практически сразу же получили ряд хотелок и рекомендаций непосредственно от клиентов.
Сохранять записи звонков. Эту фичу мы планировали, но она пока в стадии реализации и тестирования.
Нужно предоставить возможность скачать запись только участнику с наибольшими правами в конференции, чтобы она не ушла на сторону. Проигрывание записи через встроенный плеер тоже будет актуальным, чтобы клиент не использовал сторонний софт.
Скорее всего, придется ограничить время существования записи. Ведь в противном случае нам придется закупать отдельные серверы для хранения видеоконтента. Но доступ к записи на протяжении 24 часов убирает проблему через сутки запись трансляции автоматически удаляется с сервера.
Добавить вебинарную комнату самый популярный запрос. Чтобы можно было, к примеру, проводить отчетные мероприятия. То есть, клиенты хотят не просто совершать звонки, а получить универсальный инструмент для организации рабочего процесса. Им его не хватает.
Правда, с вебинарной комнатой у нас немного затык. Нужно добавить инструмент работы со слайдами без демонстрации экрана и вайтборд для рисования маркерами.
Если у вас есть идеи, как это сделать в рамках Janus с минимальным количеством вытекающих проблем с радостью послушаем.
Плюс клиенты просят добавить другие мелкие фичи, которые они увидели в сторонних проектах. Вроде размытия фона, добавления фильтров или склейку. Это не в приоритете, но в дальнейшем мы собираемся реализовать и эти фичи.
В целом разработка видеосвязи получилась неожиданной. Из инструмента, предназначенного для внутреннего использования, она стала частью нашей CRM и уже крепко вошла в инфраструктуру сервиса.
Да, еще остается целая куча проблем с совместимостью, но результат уже рабочий и наши клиенты им активно пользуются. Если будет интересно, мы запустим серию постов про конкретные проблемы с разработкой видеосвязи и путями их решения. Пишите в комменты.