惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
V
V2EX
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
The Cloudflare Blog
T
Tailwind CSS Blog
H
Help Net Security
腾讯CDC
爱范儿
爱范儿
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
Stack Overflow Blog
Stack Overflow Blog
D
DataBreaches.Net
C
Check Point Blog
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания
Делаем P2P-кинотеатр: как мы написали десктопное приложен...
Денис Брель · 2026-06-18 · via Все публикации подряд на Хабре

Средний

4 мин

0

Я разработал десктопное приложение для Windows, которое позволяет смотреть видео вместе с друзьями онлайн. Ключевая возможность — всё одновременно: один участник транслирует экран со звуком системы, и при этом все могут общаться голосом через микрофон и включать свои камеры. Никаких серверов посередине — данные идут напрямую между участниками. В статье расскажу про архитектуру, ключевые технические решения и грабли, на которые мы наступили.

Предыстория

Всё началось с простой проблемы: мы с друзьями живём в разных городах, но хотим вместе смотреть кино. Существующие решения либо платные, либо требуют регистрации, либо не передают звук системы. А хочется просто включить фильм, кинуть друзьям ссылку и смотреть, комментируя в голосовом чате, нажимая пробел, когда хочешь что-то сказать — как настоящая рация.

Готовых бесплатных решений, которые делают именно это — экран + звук системы + голос поверх + без регистрации — мы не нашли. Решили написать своё.

Выбор технологий

Платформа — Windows. Цель — один портативный .exe, который можно кинуть другу и сразу начать смотреть.

  • Electron 34 — как основа десктопного приложения

  • WebRTC — для передачи видео и аудио напрямую между участниками

  • Socket.IO — для сигналинга (помочь участникам найти друг друга)

  • Сборка — electron-builder, portable.exe

Архитектура P2P-соединения

Участники соединяются напрямую (peer-to-peer). Видео и аудио не проходят через сервер — только напрямую между клиентами. Это даёт минимальную задержку, позволяет не платить за серверную пропускную способность и гарантирует, что ваши данные видит только тот, кому вы их отправили. Никаких облачных серверов, никакой записи разговоров, никаких «корпоративных аккаунтов», куда стекается всё ваше общение.

Архитектура P2P-соединения

Участники соединяются напрямую (peer-to-peer). Видео и аудио не проходят через сервер — только напрямую между клиентами. Это даёт минимальную задержку, позволяет не платить за серверную пропускную способность и гарантирует, что ваши данные видит только тот, кому вы их отправили. Никаких облачных серверов, никакой записи разговоров, никаких «корпоративных аккаунтов», куда стекается всё ваше общение.

A ────── P2P ──────────── Участник B
     │                        │
     └──── P2P ───────────────┘
          │
     Участник C

Сервер нужен только на этапе установки соединения (сигналинг). Мы используем облачный сервер на Render.com и встроенный локальный сервер для работы по LAN.

После того как участники нашли друг друга, все данные идут напрямую. Сервер можно выключить — соединение останется.

Ключевые фичи, которые потребовали нетривиальных решений

Трансляция экрана со звуком системы

WebRTC в браузере не умеет захватывать звук системы при трансляции экрана. Electron даёт доступ к нативному API Chromium — getDisplayMedia с опцией audio: true. Пользователь видит диалог выбора окна, может выбрать свёрнутое окно и включить флажок «Поделиться звуком».

Браузерное ограничение: мобильная версия не может транслировать экран со звуком, только смотреть.

Режим рации (Push-to-Talk)

Мы сделали два режима работы микрофона:

  • Обычный: микрофон включён постоянно

  • Рация: микрофон работает только пока зажата кнопка

В десктоп-версии вход в режим рации — правая кнопка мыши по иконке микрофона. Говорить — зажать Пробел. В мобильной версии — двойной тап по микрофону.

Технически это просто включение/выключение локального трека, но важно было не трогать остальные соединения.

Плавающая панель при трансляции

Когда пользователь начинает транслировать экран, главное окно сворачивается, и появляется маленькое плавающее окно (310×78) с кнопками управления: микрофон, камера, рация, остановка трансляции. Оно всегда поверх других окон.

Рядом открывается окно камер участников (300×220) с превью всех камер и ползунками громкости.

Поддержка двух режимов: локально и через интернет

Приложение работает как через интернет (облачный сервер сигналинга), так и локально по LAN — без доступа в интернет. Это оказалось полезно для корпоративных сетей и мест с плохим интернетом.

Что пошло не так

Некоторые вещи пришлось переделывать по несколько раз:

Выбор окна для трансляции. Первая версия использовала кастомный пикер окон. Он не показывал свёрнутые окна и имел проблемы с обновлением списка. Перешли на нативный диалог Chromium — он показывает все окна, включая свёрнутые, и сам обновляется.

Модалка выбора окна на мобильной версии изначально была в 2 колонки — окна не влезали. Переделали на 3 колонки, стало нормально.

Сборка portable .exe. Electron-builder делает установщик, но нам нужен был один .exe без установки. Потребовалось отдельно собирать portable через --prepackaged.

Windows Defender. Каждая новая сборка с новым именем файла — чтобы не блокировался антивирусом.

Текущее состояние

Приложение работает, (последняя версия 1.8.0)

Три главные ценности, на которых построен продукт:

  1. Всё одновременно. Трансляция экрана со звуком системы + голос по микрофону + видео с камеры — всё это работает одновременно. Не нужно выбирать, чем жертвовать. Один показывает экран, остальные смотрят и комментируют голосом.

  2. Напрямую, без серверов. P2P-соединение — видео и аудио идут напрямую между участниками. Никаких облачных серверов для медиа, никакой слежки, никаких теорий заговора. Сервер нужен только на секунду для установки соединения.

  3. Рация по пробелу. Режим Push-to-Talk: зажал пробел — говоришь, отпустил — тебя не слышно. Идеально для комментариев во время просмотра, чтобы не шуметь в эфире постоянно.

Полный список возможностей:

  • Трансляция экрана со звуком системы (Windows)

  • Голосовой чат через микрофон

  • Видеозвонок (камера каждого участника)

  • Режим рации Push-to-Talk (зажал пробел — говоришь)

  • До 5 участников в одной P2P-сетке

  • Работает без установки (portable .exe)

  • Без регистрации, без рекламы, без слежения

  • Два языка интерфейса: русский и английский

  • Мобильная версия (PWA) для просмотра с телефона

Весь проект — open source на GitHub.

Ссылки

Иcходный код: https://github.com/outmilker1978/hamsters-theater

Скачать: https://github.com/outmilker1978/hamsters-theater/releases

Сайт проекта: https://tvhamsters.outmilk.online