Реалізація групових відеоконференцій на сайті

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація групових відеоконференцій на сайті
Складна
~2-4 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Розробка системи групових відеоконференцій на веб-сайті

Групові відеоконференції — це 3–50+ учасників, управління мікрофоном/камерою ведучим, піднята рука, брейкаут-комнати, чат, демонстрація екрану, запис. Все це вимагає продуманої архітектури як на стороні WebRTC-інфраструктури, так і на UI.

Вибір інфраструктури за масштабом

Учасників Рекомендоване рішення
2–10 LiveKit (SFU), Daily.co
10–50 LiveKit з Simulcast, 100ms
50–1000 LiveKit Broadcast, Agora, Amazon Chime
1000+ HLS-трансляція, не WebRTC

LiveKit — рекомендована основа

npm install livekit-server-sdk  # сервер
npm install @livekit/components-react livekit-client  # клієнт

Створення конференції:

import { RoomServiceClient, AccessToken, RoomOptions } from 'livekit-server-sdk';

const svc = new RoomServiceClient(
  process.env.LIVEKIT_URL!,
  process.env.LIVEKIT_API_KEY!,
  process.env.LIVEKIT_API_SECRET!
);

async function createConference(conferenceId: string, options: {
  maxParticipants?: number;
  enableRecording?: boolean;
}): Promise<void> {
  await svc.createRoom({
    name: `conf-${conferenceId}`,
    maxParticipants: options.maxParticipants ?? 50,
    emptyTimeout: 300,  // 5 хв до закриття пустої комнати
    metadata: JSON.stringify({ conferenceId, createdAt: new Date().toISOString() }),
  } as RoomOptions);
}

function generateParticipantToken(
  roomName: string,
  userId: string,
  displayName: string,
  role: 'host' | 'moderator' | 'participant' | 'viewer'
): string {
  const at = new AccessToken(
    process.env.LIVEKIT_API_KEY!,
    process.env.LIVEKIT_API_SECRET!,
    { identity: userId, name: displayName, ttl: 4 * 60 * 60 }
  );

  at.addGrant({
    roomJoin: true,
    room: roomName,
    canPublish: role !== 'viewer',
    canSubscribe: true,
    canPublishData: true,
    roomAdmin: role === 'host',
    hidden: false,
  });

  return at.toJwt();
}

Управління учасниками з сервера:

// Заглушити конкретного учасника
app.post('/api/conferences/:roomName/mute/:participantId', authenticate, async (req, res) => {
  const conference = await db.conferences.findByRoomName(req.params.roomName);
  if (conference.hostId !== req.user.id) return res.status(403).end();

  await svc.mutePublishedTrack(
    req.params.roomName,
    req.params.participantId,
    'microphone-track',
    true
  );

  res.json({ ok: true });
});

React компонент конференції

import {
  LiveKitRoom,
  VideoConference,
  useLocalParticipant,
  useParticipants,
  Chat,
} from '@livekit/components-react';

function GroupConference({ token, roomName }: { token: string; roomName: string }) {
  return (
    <LiveKitRoom
      token={token}
      serverUrl={process.env.NEXT_PUBLIC_LIVEKIT_URL}
      video={true}
      audio={true}
    >
      <VideoConference />
      <Chat />
    </LiveKitRoom>
  );
}

Брейкаут-комнати

async function createBreakoutRooms(mainRoomName: string, groups: string[][]) {
  const breakoutRooms = await Promise.all(
    groups.map((group, i) =>
      createConference(`${mainRoomName}-breakout-${i}`, { maxParticipants: group.length + 2 })
    )
  );

  for (let i = 0; i < groups.length; i++) {
    for (const participantId of groups[i]) {
      const token = generateParticipantToken(
        `conf-${mainRoomName}-breakout-${i}`,
        participantId,
        '',
        'participant'
      );
      await svc.sendData(
        `conf-${mainRoomName}`,
        Buffer.from(JSON.stringify({ type: 'breakout_invite', token, roomIndex: i })),
        [participantId]
      );
    }
  }
}

Терміни

Базова групова конференція з LiveKit + React компонентами — 1 тиждень. З брейкаут-комнатами, піднятою рукою, записом та управлінням учасниками — 2–3 тижня.