
Сегодня, специально к старту нового потока по веб-разработке, поделимся с вами туториалом, из которого вы узнаете, как создать видеочат с помощью JavaScript и NodeJS. Также вы научитесь использовать PeerJS, WebRTC и Socket.io.
Здесь вы можете увидеть живой пример приложения, которое вы будете создавать.
Подготовка к проекту
Вот что вам понадобится:
- NodeJS: посетите официальный веб-сайт Node.js, чтобы загрузить и установить Node;
- NPM: программа NPM устанавливается на ваш компьютер при установке Node.js.
Настройка проекта
Весь код этого проекта можно найти в репозитории GitHub.
- Создайте пустой каталог с именем video-chat-app.
- Откройте консоль, перейдите в наш новый каталог и запустите npm init.
- Заполните необходимую информацию для инициализации нашего проекта.
- Запустите npm install express ejs socket.io uuid peer. Команда установит все зависимости, необходимые для создания этого приложения.
- А также в качестве dev-зависимости установите Nodemon. Нужно выполнить npm install-dev nodemon. Это установит nodemon как dev-зависимость.
- Создайте файл server.js — в этом файле будет храниться вся ваша серверная логика.
Теперь, когда у вас настроен наш проект, вы можете приступить к созданию приложения!
Программы для видеоконференций. Аналоги Zoom
Создание сервера (с Express JS)
Первое, что вам нужно сделать, — это запустить ваш сервер. Мы собираемся использовать для этого Express. Express — это минималистичный веб-фреймворк для Node.js. Express позволяет очень легко создавать и запускать веб-сервер с помощью Node.
Давайте создадим шаблонный файл начального приложения Express.
// server.js const express = require(«express»); const app = express(); const server = require(“http”).Server(app); app.get(«/», (req, res) => < res.status(200).send(«Hello World»); >); server.listen(3030);
Теперь ваш сервер запущен, вы можете протестировать его, запустив:
> nodemon server.js
Теперь откройте свой браузер и перейдите по адресу: localhost:3000, вы должны увидеть Hello World.

Создание первой страницы
Вместо того чтобы выводить текст, когда кто-то посещает ваш корневой маршрут, вы хотели бы присылать HTML. Для этого нужно использовать EJS (встроенный JavaScript). EJS — это язык шаблонов.
Чтобы использовать EJS в Express, вам нужно настроить ваш шаблонизатор. Для настройки добавьте эту строку кода в файл server.js.
app.set(‘view engine’, ‘ejs’)
Доступ к EJS по умолчанию осуществляется в каталоге views. Теперь создайте новую папку views в каталоге. В этой папке добавьте файл с именем room.ejs. Пока что думайте о нашем файле room.ejs как о HTML-файле.
Как пользоваться программой ZOOM. Пошаговая настройка видеоконференции
Вот как выглядит ваша файловая структура:
|— video-chat-app |— views |— room.ejs |— package.json |— server.js
Теперь добавьте HTML-код в файл room.ejs.
Как только вы скопируете приведённый выше код, нужно немного поменять app.js:
app.get(‘/’, function (req, res) < // OLD CODE res.status(200).send(«Hello World»); >)
Выше приведён старый код, в котором вы отправляете клиенту текст «Hello World!». Вместо этого вы хотите отправить файл room.ejs:
app.get(‘/’, function (req, res) < // NEW CODE res.render(‘room’); >)
Теперь откройте браузер и перейдите по адресу: localhost:3030, и вы увидите, что отображается файл room.ejs!

Добавление CSS
Выглядит не очень хорошо, правда? Это потому, что в вашем проекте нет стилей. Итак, добавьте немного CSS.
Нам нужно будет добавить новую папку в проект под названием public. В этой папке создайте файлы style.css и script.js. Вот ваша новая файловая структура:
|— weather-app |— views |— index.ejs |— public |— style.css |— script.js |— package.json |— server.js
Express не даёт доступа к этому файлу по умолчанию, поэтому вам нужно открыть его с помощью следующей строки кода:
app.use(express.static(‘public’));
Этот код позволяет вам получить доступ ко всем статическим файлам в папке “public”. Наконец, вам нужен CSS. Поскольку это не курс по CSS, я не буду вдаваться в подробности, но если вы хотите использовать мои стили, вы можете скопировать их отсюда.
После того как вы добавили CSS, вы можете посетить: localhost:3030. Вы заметите, что приложение выглядит немного лучше.
Настройка комнат
К настоящему моменту ваш файл server.js должен выглядеть так:
У вас есть один GET-роут и запуск сервера. Однако, чтобы ваше приложение работало, нужно всякий раз, когда новый пользователь посещает ваш роут по умолчанию, перенаправлять его на уникальный URL-адрес. Следует использовать библиотеку uuid для создания случайного уникального URL-адреса для каждой комнаты.
UUID — это библиотека javascript, которая позволяет вам создавать уникальные идентификаторы. В вашем приложении вы будете использовать uuid версии 4 для создания уникального URL. Но сначала импортируйте uuid в server.js.
const < v4: uuidv4 >= require(«uuid»);
Теперь нужно использовать uuid для создания случайного уникального идентификатора для каждой комнаты и перенаправлять пользователя в эту комнату.
app.get(“/”, (req, res) => < res.redirect(`/$`); >);
И, прежде чем вы протестируете это, я также хотел добавить страницу для каждой уникальной комнаты, и вы передадите текущий URL этой странице.
app.get(“/:room”, (req, res) => < res.render(“room”, < roomId: req.param.room >); >);
Вы передали roomId в room.ejs на этом закончили настройку ваших комнат. А теперь, если вы посетите localhost:3030, вы будете перенаправлены на уникальный URL.

Добавление видео пользователя
Вы будете работать с файлом script.js, который вы создали ранее. script.js будет содержать весь клиентский код приложения.
Итак, вот что необходимо сделать: нужно получить видеопоток, а затем добавить этот поток в элемент видео.
let myVideoStream; const videoGrid = document.getElementById(«video-grid»); const myVideo = document.createElement(«video»); myVideo.muted = true; navigator.mediaDevices.getUserMedia(< audio: true, video: true, >) .then((stream) => < myVideoStream = stream; addVideoStream(myVideo, stream); >);
Теперь создайтем функцию addVideoStream, которая добавит поток к видеоэлементу.
const addVideoStream = (video, stream) => < video.srcObject = stream; video.addEventListener(«loadedmetadata», () =>< video.play(); videoGrid.append(video); >); >;
Этот код добавит пользовательский поток к видеоэлементу. Вы можете проверить это, посетив localhost:3030, и вы увидите всплывающее окно с видео

Добавление возможности разрешить другим пользователям транслировать свои видео в потоковом режиме.
Пришло время использовать Socket.io и PeerJS. Для тех, кто не знает, Socket.io позволяет взаимодействовать серверу и клиенту в режиме реального времени. PeerJS позволяют реализовать WebRTC.
Сначала импортируйте socket.io и peerjs в server.js и прослушайте событие соединения.
// server.js const express = require(“express”); const app = express(); const server = require(“http”).Server(app); const < v4: uuidv4 >= require(“uuid”); app.set(“view engine”, “ejs”); const io = require(“socket.io”)(server); const < ExpressPeerServer >= require(“peer”); const peerServer = ExpressPeerServer(server, < debug: true, >); app.use(“/peerjs”, peerServer); app.use(express.static(“public”)); app.get(“/”, (req, res) => < res.redirect(`/$`); >); app.get(“/:room”, (req, res) => < res.render(“room”, < roomId: req.param.room >); >); io.on(“connection”, (socket) => < socket.on(“join-room”, (roomId, userId) =>< socket.join(roomId); socket.to(roomId).broadcast.emit(“user-connected”, userId); >); >); server.listen(3030);
Теперь ваш сервер прослушивает событие присоединения к комнате. Далее настройте ваш script.js.
// public/script.js const socket = io(“/”); const videoGrid = document.getElementById(“video-grid”); const myVideo = document.createElement(“video”); myVideo.muted = true; var peer = new Peer(undefined, < path: “/peerjs”, host: “/”, port: “3030”, >); let myVideoStream; navigator.mediaDevices .getUserMedia(< audio: true, video: true, >) .then((stream) => < myVideoStream = stream; addVideoStream(myVideo, stream); peer.on(“call”, (call) => < call.answer(stream); const video = document.createElement(“video”); call.on(“stream”, (userVideoStream) =>< addVideoStream(video, userVideoStream); >); >); socket.on(“user-connected”, (userId) => < connectToNewUser(userId, stream); >); >); const connectToNewUser = (userId, stream) => < const call = peer.call(userId, stream); const video = document.createElement(“video”); call.on(“stream”, (userVideoStream) =>< addVideoStream(video, userVideoStream); >); >; peer.on(“open”, (id) => < socket.emit(“join-room”, ROOM_ID, id); >); const addVideoStream = (video, stream) => < video.srcObject = stream; video.addEventListener(“loadedmetadata”, () =>< video.play(); videoGrid.append(video); >); >;
Теперь, если в комнату войдёт новый пользователь, вы увидите его видео.
Создание пользовательского интерфейса
С видеочастью закончили. А теперь займитесь стилизацией. Но сначала добавьте контент в файл room.ejs. (Добавьте CDN font-awesome внутри тега head.)
// views/room.ejs Video Chat
Затем откройте файл style.css и добавьте немного CSS.
Вот и всё! Поздравляем, вы успешно создали видеочат! Теперь вы можете развернуть его на Heroku и показать его всему миру. Демо и исходный код.
Это лишь небольшой пример того, какие вещи может делать веб-разработчик, причем в одиночку. Сделать just for fun экспорт музыки в Spotify и получить известность, пока огромная компания долго думает над решением задачи — без проблем. За один вечер набросать и выкатить расширение для браузера, которое упростит жизнь миллионам пользователей — тоже по силам. На что еще способна веб-разработка — зависит только от фантазии программиста. Приходите учиться, чтобы освоить дзюцу веб-разработки и стать настоящим самураем интернета.

Узнайте, как прокачаться в других специальностях или освоить их с нуля:
- Профессия Fullstack-разработчик на Python
- Профессия C++ разработчик
- Профессия Java-разработчик
- Курс «Python для веб-разработки»
ПРОФЕССИИ
- Профессия Data Scientist
- Профессия Data Analyst
- Профессия QA-инженер на JAVA
- Профессия Frontend-разработчик
- Профессия Этичный хакер
- Профессия C++ разработчик
- Профессия Разработчик игр на Unity
- Профессия Веб-разработчик
- Профессия iOS-разработчик с нуля
- Профессия Android-разработчик с нуля
КУРСЫ
- Курс по Data Engineering
- Курс по Machine Learning
- Курс «Machine Learning и Deep Learning»
- Курс «Математика для Data Science»
- Курс «Математика и Machine Learning для Data Science»
- Курс «Python для веб-разработки»
- Курс «Алгоритмы и структуры данных»
- Курс по аналитике данных
- Курс по DevOps
Источник: habr.com
Как создать приложение для видеосвязи в 2023 году
Когда начался карантин, мир переместился в цифровое измерение. К счастью, не навсегда — с тех пор наши социальные и рабочие привычки вернулись в норму. Однако видеосвязь осталась и никуда уходить не собирается: теперь даже есть целые офисы и университеты, где вся жизнь происходит в Zoom.В этой статье подробно поговорим про то, как создать приложение для видеосвязи.
Время чтения: 9 минут

Главное
- Список ключевых функций приложения для видеосвязи включает в себя аудио- и видеозвонки, текстовые чаты, списки контактов и настраиваемые профили.
- Сделать приложение более удобным помогут виртуальные доски, демонстрация экрана и шумоподавление.
- Стоимость разработки колеблется от 6 до 7 млн рублей.
Обзор рынка
Для начала проведем небольшое исследование и разберемся, что сейчас происходит в сегменте.
Спрос
Спрос на приложения для видеосвязи взлетел во времена пандемии и с тех пор держится на высоком уровне. Даже после снятия всех ограничений эти продукты продолжают привлекать миллионы новых пользователей. Вот только один пример: в январе 2022 Microsoft Teams достигли отметки в 270 миллионов активных пользователей в месяц — на 20 миллионов больше по сравнению с июлем 2021 (Grand View Search) https://www.grandviewresearch.com/industry-analysis/video-conferencing-market
Размер рынка и перспективы
В 2021 году размер рынка приложений для видеосвязи составил $6,28 млрд. Ожидается, что до конца десятилетия рынок будет расти в темпе 12% в год, и к 2030 году этот показатель вырастет до $19,73 млрд. Это значит, что успешных игроков в ближайшем будущем ждут отличные перспективы.

Конкуренция
Значительную часть рынка контролируют несколько гигантов (те же самые Zoom или Discord). С Zoom уже вряд ли получится побороться, но на рынке все равно осталось место для свежих и инновационных идей. Главное — найти свою нишу и отталкиваться от ее конкретных запросов.
Типы приложений для видеосвязи
Можно выделить 3 типа приложений, в которых видеосвязь — это одна из ключевых функций.
С фокусом на конференциях
Такие приложения поддерживают формат конференций — звонков с десятками и иногда даже сотнями участников. За счет этого они очень популярны в сегментах бизнеса и образования. Пандемия сделала их неотъемлемой частью жизни для миллионов людей: вы точно слышали про Zoom, Microsoft Teams, Google Meet и схожие продукты.
С фокусом на видеозвонках
Приложения в этой категории в первую очередь используются для повседневного общения между друзьями и коллегами — акцент здесь делается на персональные звонки, а не крупные конференции.
Здесь видеосвязь — одна из основных функций, которую разработчики интегрируют в мессенджер. Примеры тоже в представлении не нуждаются: это Telegram, WhatsApp и Skype.
С фокусом на развлечения
Эти приложения позволяют пользователям собираться вместе в групповых звонках и включают в себя развлекательные функции — например, стриминг или встроенные игры. Примеры: Discord, Snapchat и Rave.
Классификация может пригодиться, когда вы будете составлять конкретный набор функций, но слишком серьёзно к ней относиться не стоит. Помните, что любое приложение для видеосвязи — гибкий инструмент. Люди часто используют Discord для учебы, Telegram — для рабочих созвонов, а Zoom — для онлайн-вечеринок.
Варианты применения
Видеосвязь не всегда выступает в качестве ключевой функции — ее часто добавляют для того, чтобы сделать приложение более удобным. Вот несколько сегментов, где видеочаты играют второстепенную, но важную роль:
Телемедицина
Видеочаты в приложениях для телемедицины позволяют врачам обследовать пациентов в реальном времени. Это гораздо эффективнее, чем анализировать фотографии или читать описания симптомов.

Несколько лет назад мы разработали приложение для онлайн психотерапии. Конечно же, без видеочата не обошлось
Образование
На время карантина школы и университеты начали массово переезжать в Zoom или аналогичные сервисы. Сохранить эффективную коммуникацию между учителями и студентами помогли как раз видеоконференции, которые имитировали условия реальных классных комнат.
Финансы
Банкам нужно много общаться с клиентами — например, консультировать по услугам. Поэтому некоторые банки начали внедрять в свои приложения видеосвязь — это удобнее, чем обычные текстовые чаты. А еще весь процесс становится более персонализированным, от чего выигрывают и банки, и клиенты.
Онлайн-торговля
Вы когда-нибудь слышали про livestream shopping? Это формат, в котором инфлюенсеры и селебрити продвигают продукты бренда в прямом эфире. Вообще он родом из Азии, но вполне возможно, что и на западе мы с ним скоро начнем сталкиваться чаще.
Почему мы вообще про него вспомнили: здесь не обойтись без стриминга, а значит, и без софта для видеосвязи.

Приложение для формата livestream shopping от Purrweb. Пользователи могут добавлять товары в корзину прямо на стриме
Онлайн-знакомства
Многие приложения для знакомств пользуются сомнительной репутацией из-за огромного количества фейков. Оно и неудивительно — в текстовых чатах легко врать о том, кто ты на самом деле. Поэтому в качестве гаранта безопасности можно использовать видеосвязь: камеру обмануть гораздо сложнее.
READ MORE Хочу как Tinder: разработка мобильного приложения для знакомств
Известные примеры
Давайте изучим несколько популярных приложений — это отличный способ собрать положительные референсы и посмотреть на важные функции в действии.
Zoom
Самое популярное приложение для видеосвязи. Здесь все происходит в комнатах — виртуальных пространствах, где можно общаться с помощью текста, голоса и видео. Для презентаций и выступлений есть функция демонстрации экрана, а гибкая система сессионных залов поможет разделить большую группу людей на несколько подгрупп.
Пользователи могут планировать созвоны, создавать групповые чаты и вместе писать что-то на виртуальных досках. Приложение можно синхронизировать со списком контактов на телефоне, а широкий выбор расширений позволяет адаптировать платформу под любые нужды.

Zoom имеет множество интеграций с популярными приложениями
Telegram
Самый передовой мессенджер на рынке. Помимо текстовых чатов и видеозвонков на несколько тысяч участников команда Telegram предлагает каналы, голосовые сообщения, видеосообщения (знаменитые «кружочки»), папки для чатов и огромные просторы для кастомизации. В качестве приятного бонуса можно ставить отправку сообщений на таймер или посылать их без звука, чтобы не потревожить другого человека.
В приложении есть специальный API, с помощью которого пользователи могут создавать ботов и автоматизировать практически любую функцию. Telegram также гордится высокими стандартами анонимности и приватности: например, можно привязать аккаунт к специальному номеру, сгенерированному на блокчейне, и не раскрывать никакие персональные данные.

Telegram регулярно радует пользователей инновационными функциями
Discord
Discord изначально задумывался как платформа для досуга и веселья. Однако приложение получилось настолько удобным и универсальным, что сейчас им пользуются даже для управления командами. Все взаимодействия здесь происходят на серверах, которые делятся на каналы.
Эти каналы могут быть как текстовыми, так и голосовыми. Голосовые каналы также поддерживают видео и по сути работают как комнаты в Zoom. Каждый сервер можно детально настраивать под запросы сообщества: например, назначать роли и давать участникам разные права доступа. И, конечно, куда же без приятных мелочей вроде демонстрации экрана и виртуальных досок.

Система серверов и каналов позволяет удобно организовать взаимодействие с различными социальными группами
Snapchat
Snapchat — это мессенджер, который позволяет пользователям посылать друг другу короткие видеосообщения («снэпы»). Эти сообщения исчезают после того, как их посмотрели.
Юзеры могут общаться текстом и голосом в чатах, поддерживающих до 16 участников одновременно, а также выкладывать истории — те самые, которые чуть позже украл Instagram*. Snapchat позиционирует себя как яркое приложение для досуга, поэтому здесь можно найти много смешных видеофильтров, игр и кастомных эмодзи.

В Snapchat можно посылать короткие видео, общаться в чатах и постить истории
Ключевые функции
Самые-самые основы, без которых не выживет ни один MVP.
Регистрация
Регистрация должна проходить быстро и интуитивно, чтобы пользователь мог практически сразу начать пользоваться приложением. Если хотите сделать процесс быстрее, можно добавить вход через социальные сети.
Профили
У пользователей должна быть возможность легко редактировать профили: например, менять контактные данные, аватарки или никнеймы.
Аудио- и видеозвонки
Ядро любого приложения для видеосвязи. Совет от нас: чем больше людей могут участвовать в групповых звонках, тем лучше — так продукт привлечет клиентов, которым часто приходится взаимодействовать с крупными группами. Чаще всего это учителя и менеджеры.
Еще пользователи ценят безопасность, поэтому стоит защитить все передаваемые данные с помощью сквозного шифрования (E2EE).
Текстовые чаты
Микрофон или камеру не всегда можно включить, но это не должно ограничивать пользователей — поэтому нужно добавить текстовые чаты. А чтобы приложение было еще более гибким, все чаты должны поддерживать изображения, видео и аудиофайлы.

Групповые чаты в Zoom
Списки контактов
Сделать удобный список контактов помогут 2 приема. Первый — синхронизация со списком контактов на телефоне. Второй — простое редактирование: у пользователей не должно возникать никаких проблем с тем, чтобы добавлять новые контакты и удалять старые.
Дополнительные функции
Более продвинутые функции, о которых можно задуматься после успешной реализации всех основных. Список не исчерпывающий — мы собрали самые популярные варианты.
Демонстрация экрана
Идеально для питчинга, презентаций, стримов, совместного просмотра фильмов и дружеских уроков по Photoshop. Спрос на эту функцию очень высокий среди любой аудитории, поэтому рекомендуем реализовать ее как можно скорее — но не в ущерб ключевым функциям.

Благодаря функции скриншеринга в Discord можно стримить игры
Пользовательские эмодзи и стикеры
Все любят мемы и шутки для своих. Все также любят подстраивать приложения под себя. Кастомные эмодзи и стикеры — отличная возможность удовлетворить оба этих запроса.

В Telegram можно создавать свои стикеры с помощью специального бота
Виртуальное шумоподавление
В соседней комнате шумят дети, соседи сверху решили снести все перегородки в квартире, за окном в пробке стоят 5 машин скорой помощи — а презентовать доклад нужно сейчас. Виртуальное шумоподавление позволит всем участникам звонка без проблем понять, что говорит докладчик.
Можно написать алгоритм с нуля, но это дорого и долго (как в общем-то и все, связанное с машинным обучением). Тут на помощь приходят уже готовые решения — например, Krisp.
Виртуальные доски
Виртуальная доска — это простой графический редактор, которым могут пользоваться несколько людей сразу. Такие доски доски полезны для брейнштормов, планирования и любых других задач, связанных с совместной деятельностью.

Виртуальные доски в Zoom — отличный способ наладить совместный рабочий процесс
Фильтры и эффекты
Фильтры и эффекты часто ассоциируются с развлечениями, однако они могут выполнять и гораздо более практичные задачи. Эффект размытого фона, например, очень выручает людей, которые ревностно относятся к личному пространству. Есть и разные забавные варианты — добавляйте их на свое усмотрение.
Стратегии монетизации
Всё понятно, но как на этом вообще зарабатывать? На выбор есть несколько стратегий, но в реальности используется только одна из них — фримиум (от англ. freemium, free + premium). Про нее и расскажем.
Фримиум работает так: клиенты бесплатно пользуются базовыми функциями приложения, но по желанию могут оформить подписку и получить доступ к более продвинутым. Тех, кто оформляет подписку, разработчики награждают особыми статусами и другими бонусами. Zoom, Discord, Telegram — отличные примеры фримиум-моделей.
Как разработать приложение для видеосвязи
Как разработать приложения видеоконференцсвязи на основе Gstreamer для приставок RDK и Linux
Пандемия COVID-19 стала катализатором появления новых онлайн-сервисов. Например, Zoom стал настолько успешным, что в этом месяце обогнал IBM по капитализации. Программные инженеры Promwad были вдохновлены этим успехом и решили пойти еще дальше: как насчет реализации видеоконференцсвязи на Smart TV и STB? Тогда у пользователей такого приложения будет возможность не только общаться на работе, но и наслаждаться удаленными встречами с друзьями, болеть за футбольную команду, вместе смотреть фильм или заниматься спортом с тренером.

Почему-то у большинства операторов цифрового ТВ нет такой услуги, хотя с инженерной точки зрения все эти функции могут быть реализованы на приставках на базе Linux/Android и RDK.
Давайте проанализируем архитектуру Zoom-подобного приложения для видеоконференцсвязи для Smart TV и реализуем кодирование видеопотока с помощью мультимедийной платформы с открытым исходным кодом GStreamer. Мы собирали информацию для работы с этим фреймворком по частям, но оно того стоило.
Проблемы и архитектура программного обеспечения
При разработке архитектуры приложений для телевизионных приставок важно учитывать все возможные программные и аппаратные ограничения. Инженеры, создающие программы для настольных ПК, как правило, не сталкиваются с этими проблемами, в то время как для разработчиков встраиваемых систем это обычное дело.
Итак, что нас ждет на приставках:
- Ограниченные ресурсы процессора и самих устройств. В большинстве случаев устройства STB используют различные процессоры ARM, что подразумевает несколько ограничений и дополнительных задач, таких как необходимость использования аппаратного кодирования/декодирования для видеопотока. Итак, производительность — «узкое место».
- Разные архитектуры в приставках разных производителей. Некоторые из них основаны на Android; другие используют дистрибутивы на основе RDK или Linux с их ограничениями и нюансами. Поэтому на старте процесса разработки лучше выбрать наиболее распространенные и кроссплатформенные решения в разных программных модулях. Не говоря уже о поддержке десктоп-версии. А затем перейдем к частным случаям.
- Сетевые ограничения. Многие приставки работают как через Ethernet, так и через Wi-Fi. Сжатие и передача видео/аудиопотоков — еще одно «узкое место» в приложениях такого типа.
- Безопасность потоковой передачи и другие вопросы безопасности данных.
- Поддержка камер и микрофонов на встраиваемых платформах.
Теперь мы можем кластеризовать саму архитектуру. Наше приложение для видеоконференцсвязи для приставок будет состоять из нескольких крупных компонентов и модулей:
- Захват видеопотока
- Захват аудиопотока
- Сетевой модуль
- Модуль кодирования видео / аудиопотока
- Модуль декодирования видео / аудиопотока
- Отображение видеоконференции на экране
- Вывод звука
- Цветовые преобразования
- Несколько других второстепенных компонентов
В упрощенном виде архитектуру можно изобразить следующим образом:

В этом обзоре мы сосредоточимся на декодировании/кодировании видеопотока и возможной реализации с помощью фреймворка GStreamer, поскольку это один из критических моментов в разработке приложений для видеоконференцсвязи.
Кодирование и декодирование аудио/видеопотока
Преимущества GStreamer для видеоконференцсвязи
Как мы уже отмечали, потоковое видео — одно из «узких мест». Предположим, у вас есть камера, которая выводит кадры со скоростью 30 кадров в секунду при небольшом разрешении 640 × 480. В сумме получается в RGB24: 640 * 480 * 3 * 30 = 27 648 000 байт в секунду, то есть более 26 мегабайт в секунду, что не работает по очевидным причинам, в частности, по пропускной способности сети.
Одно из решений — реализовать кодирование видео с помощью какой-нибудь библиотеки. Как можно догадаться из названия обзора, наш выбор пал на фреймворк GStreamer. Почему именно эта библиотека? Вот некоторые из его преимуществ перед другими решениями:
- Хорошее кроссплатформенное решение с отличной поддержкой Linux и Android.
- В RDK Gstreamer — это стандарт кодирования/декодирования, включенный в дистрибутив по умолчанию.
- Он поддерживает широкий спектр модулей, фильтров и кодеков. Например, FFmpeg, который можно использовать для тех же целей, является одним из модулей GStreamer.
- Легко построить конвейер. Легко создать цепочку кодирования/декодирования, а конвейерный подход позволяет плавно заменять кодеки, фильтры и т. д. без необходимости переписывать код.
- C/C++ API включен.
- Поддержка аппаратных кодеров/декодеров, в частности OpenMAX API — важная вещь для работы с приставками.
Изучение GStreamer и конвейеров
Прежде чем переходить к обзору кода, давайте посмотрим, что мы можем без этого сделать. GStreamer включает полезные утилиты для работы, в частности:
- gst-inspect-1.0 позволит вам увидеть список доступных кодеков и модулей, чтобы вы могли сразу увидеть, что с ним делать, и выбрать набор фильтров и кодеков.
- gst-launch-1.0 позволяет запускать любой конвейер.
GStreamer использует схему декодирования, при которой поток последовательно проходит через различные компоненты, от источника к выходу приемника. Вы можете выбрать что угодно в качестве источника: файл, устройство, выход (приемник), также может быть файл, экран, сетевые выходы и протоколы (например, RTP).
Классический пример воспроизведения файла mp4:
gst — launch — 1.0 filesrc location = file . mp4 ! qtdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
Вход принимает файл mp4, который проходит через демультиплексор mp4 — qtdemux, затем через синтаксический анализатор h264, затем через декодер, конвертер и, наконец, вывод.
Вы можете заменить autovideosink на filesink с параметром файла и вывести декодированный поток непосредственно в файл.
Программирование приложения с помощью GStreamer C/C ++ API. Попробуем расшифровать.
Теперь, когда мы знаем, как использовать gst-launch-1.0, мы делаем то же самое в нашем приложении. Принцип остается прежним: мы строим конвейер декодирования, но теперь мы используем библиотеку GStreamer и glib-events.