Привет, Хабр! Мы — команда разработчиков платформы корпоративных коммуникаций Frisbee. Сегодня речь пойдет об одной из уникальных частей нашей платформы, которая решает важную проблему внутренних коммуникаций, — корпоративном видеохостинге FrisbeeTube. Эта статья будет интересна как нашим коллегам-разработчикам, так и ИT-директорам и менеджменту, которые ищут надежное решение для хранения, организации и использования видеоконтента внутри компании.

Решая проблемы безопасности

FrisbeeTube появился как ответ на растущую потребность корпоративного сектора в видеоконтенте. К примеру, презентации, инструкции, видеоотчеты о работе и результатах и др. Видео — удобный и наглядный формат, но его использование в публичных сервисах, таких как YouTube, вызывает проблемы. Речь не только про блокировки аккаунтов из-за определенных слов в контенте и замедление сервиса. Немаловажно и то, что корпоративная информация оказывалась вне зоны контроля. Обо всех этих запросах и болях бизнеса мы узнавали от наших клиентов и, конечно, испытали те же неудобства и сами.

Изначально мы предполагали, что FrisbeeTube сможет существовать отдельно, но в процессе разработки перешли к более тесной и плотной интеграции с нашим мессенджером Frisbee. Сейчас FrisbeeTube функционирует как корпоративная видеотека, заточенная под механизм синхронизации пользователей и групп с Frisbee. При этом важно понимать, что у FrisbeeTube нет собственной административной панели: доступ к просмотру видео полностью определяется членством пользователя в соответствующей группе Frisbee, куда была сделана публикация. Если пользователь удаляется из группы в Frisbee, он теряет доступ к видео на стороне FrisbeeTube. Более того, передать ссылку на видео кому-то, кто не зарегистрирован в Frisbee, невозможно, поскольку ресурс для стриминга выдается только после проверки токена, подтверждающего членство в группе.

Плеер FrisbeeTube
Плеер FrisbeeTube

Мост между мессенджером и видеохостингом

Процесс публикации видео в FrisbeeTube максимально упрощен и реализован через FrisbeeTube-бота, который выступает в роли своеобразного интерфейса или мостика между мессенджером и сервисом видеохостинга. Бот сам по себе является полноценным пользователем, который проводит через весь процесс публикации. На видео показан процесс загрузки видео.

Он написан на WebFlux, что позволяет обрабатывать большое количество одновременных запросов, избегая блокировок, и поддерживает состояние каждой беседы, сохраняя контекст, если пользователь отвлекся и вернулся к оформлению видео позже. Единственная цель бота на данный момент — провести пользователя через процесс загрузки, обработки, заполнения метаданных и публикации видео в выбранную группу.

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

Плейлисты FrisbeeTube
Плейлисты FrisbeeTube

Под капотом: видеопроцессинг и магия ИИ

Когда пользователь загружает исходный файл, который может быть практически любого формата благодаря поддержке FFMPEG, видеопроцессор FrisbeeTube получает внутреннюю ссылку из Frisbee и начинает работу.

Первый и самый критичный этап — это перекодирование видео в конечный формат MP4. Для обеспечения стабильного просмотра в любых условиях, включая слабое интернет-соединение, процессор создает три версии видео: наибольшего, среднего и минимально допустимого качества. Из первоначальной конвертации в наибольшее качество мы также выполняем несколько важных операций:

  • Оптимизация для стриминга: метаданные MP4-файла перемещаются в самое начало, что критически важно для немедленного начала потоковой передачи.

  • Нормализация звука: поскольку большинство бизнес-видео — это разговорные отчеты, записи встреч или обзоры, мы делаем акцент на четкости речи, проводя шумоподавление и нормализацию уровня звука. Это позволяет избежать резких перепадов громкости в плейлисте, когда одно видео тихое, а другое громкое.

После создания трех версий, они загружаются в наше S3-хранилище. Следующий этап — транскрибация: в сервис, где используется технология Whisper, отправляется аудиодорожка. Whisper возвращает JSON с тайм-кодами и соответствующим текстом речи.

Полученная транскрибация далее поступает в менеджер задач. Он выполняет роль диспетчера, регулируя количество задач для LLM, чтобы предотвратить неконтролируемый доступ и сбои. LLM использует текст транскрибации для генерации обязательных метаданных: краткого описания и тайм-кодов к видео. После завершения этого процесса бот получает уведомление и предлагает пользователю завершить оформление, добавив остальные метаданные, такие как описание, превью (картинка-плитка) и выбор группы для публикации. Превью по умолчанию генерируется автоматически как кадр с пятой секунды видео, но пользователь может загрузить и свое.

Мы планируем пойти дальше и предоставлять пользователям чистую аудиодорожку. Это позволит включать видео просто как подкаст.

Для развертывания Frisbee и работы FrisbeeTube необходимо учитывать два ресурсоемких элемента, которые скрыты от обычных пользователей Youtube или его аналогов. Во-первых, это сервис перекодирования видео, который использует FFMPEG и достаточно “прожорлив” относительно CPU-ресурсов. Для быстрой конвертации мы выделяем порядка 12 ядер, что является основным требованием к вычислительным ресурсам. Но система будет работать и с 4 ядрами, все зависит от количества активных пользователей, публикующих свои видео на портале. Во-вторых, видеофайлы требуют значительного пространства, поэтому заказчику необходимо иметь определенный запас хранилища. Отдельно стоит отметить интеграцию с нашими развернутыми в закрытом контуре LLM-системами, которые необходимы для суммаризации, транскрибации и работы с тайм-кодами. Впрочем, функционал ИИ можно отключить, если нет возможности выделить под него достаточные мощности.

Архитектура доверия: синхронизация данных и персонализация

Одна из ключевых архитектурных особенностей FrisbeeTube — админкой для пользователя, по сути, выступает сам мессенджер.

Пространство FrisbeeTube в мессенджере с каналами, куда приходят ссылки на свежие видео от коллег
Пространство FrisbeeTube в мессенджере с каналами, куда приходят ссылки на свежие видео от коллег

Для пользователей нет необходимости переключаться между разными приложениями, а для админов — заводить и контролировать отдельные учетные записи. Эта синхронизация происходит на основе event-driven системы, где FrisbeeTube выступает подписчиком на события, происходящие в мессенджере, через Kafka. Мы следим за составом группы (кто добавился/удалился), за изменением профилей пользователей, изменением характеристик самих групп: когда группа стала плейлистом (то есть в ней появилась первая публикация), смена иконки, названия, удаление группы и т.д. Сущности Frisbee зеркалятся в FrisbeeTube, хоть и под другими названиями.

Интересный момент возникает при “холодном старте”. Если группа в Frisbee никогда ранее не была плейлистом в FrisbeeTube, при первой публикации мы делаем единичный REST-запрос, чтобы забрать текущий состав группы и перенести его в нашу базу данных (Postgres в FrisbeeTube, в отличие от Cassandra в Frisbee). После этого включается автоматическая синхронизация через ивенты. Плейлист в FrisbeeTube всегда соответствует группе в мессенджере.

Мы также реализовали двухстороннюю связь для функционала лайков: отметка “Нравится”, поставленная в FrisbeeTube, отражается в Frisbee как тег. Этот тег позволит пользователю искать понравившиеся видео в FrisbeeTube, создавая персональную подборку.

Поиск видео в мессенджере по меткам
Поиск видео в мессенджере по меткам

В настоящее время мы активно разрабатываем функционал персонализации контента с помощью ИИ. Идея в том, что разные роли в компании (например, Java-разработчик, маркетолог, бухгалтер и т.д.) интересуются разными аспектами одного и того же видео. Передавая роль пользователя в LLM вместе с транскрибацией, мы можем генерировать описания, специально подчеркивающие те моменты и детали, которые будут наиболее интересны конкретному сотруднику. Кроме того, ИИ будет предоставлять разметку видео по степени важности (максимально интересно, средне, можно пропустить), помогая пользователю при большом объеме контента расставить приоритеты просмотра.

Стек и сложности разработки

Frisbee Tube разрабатывался нами с нуля, что позволило нам использовать самый современный стек: Java 25 и Spring Boot 4. Сервис создан нами с понятной горизонтальной масштабируемостью, что позволяет обеспечивать его работу как в условиях средних компаний, так и крупных корпораций с большой активностью пользователей.

Основными архитектурными сложностями были не столько технологии, сколько реализация концепции, при которой пользователи FrisbeeTube и Frisbee — это одна и та же сущность, и отказ от админки в пользу синхронизации по данным. Также значительная работа потребовалась для обеспечения адекватного качества видео: корректная обработка, нормализация звука и речи, чтобы контент было комфортно смотреть. Весь многоступенчатый процесс публикации видео внутри сервиса управляется через state-машину, что делает процесс переходов логичным и структурированным.

FrisbeeTube — это не просто хранилище, а глубоко интегрированный инструмент, который превращает корпоративный мессенджер в полноценную, умную экосистему для работы с видеоконтентом.

Как вы решаете задачу хранения и структурирования корпоративного видео: применяете ли вы какие‑то ИИ‑сервисы для транскрибации и персонализации? Делитесь своим опытом, идеями, оставляйте вопросы о нашей фиче в комментариях — будем рады обсудить подходы, лайфхаки и возможные улучшения в части разработки и эксплуатации такого рода функционала внутри корпоративных платформ.

Комментарии (0)