Коли я ще працював на теплій програмістській роботі, то мав потребу записувати короткі відео для користувачів та клієнтів.
Дуже проста функція — екран + кружечок з вебкамери + мікрофон. Розумні люди для цього зробили Loom та йому подібні, професіонали користуються OBS.
Але Loom не має апки для Linux і працює лише як аддон у браузері. Я побачив тут opportunity та подумав — а чому б мені не зробити таку нативну апку? Задача звучить досить просто — іконка в треї, натискаєш на неї — починається запис, натискаєш ще раз — запис завершується і відкривається віконечко з посиланням на твоє відео, яке можна пошарити кому треба.
Чому нативну? В мене є незакритий гештальт. Дуже дратує веб-bloatware.
План був такий — зробити опенсорну апку та закритий сервер. З людей брати гроші за сторедж. Таких проєктів багато, а значить ідея провалідована.
Поліз робити, і…
Виявилося що все не так просто.
Я хотів взяти Rust, ui бібліотеку egui, там зробити одну кнопку.
Почав копати як отримати доступ до екрана та вебки, і нічого кращого ніж ffmpeg не знайшов. Для Rust є біндинги до ffmpeg, але вони настільки низькорівневі, що їх вивчення не вкладалося в бюджет mvp.
Мені вдалося зробити мікропрототип запису екрана, але я так і не зміг прокинути параметри кодування ffmpeg, які регулюють якість і також зіткнувся з несумісністю версій.
Якщо пошукати, то є програми для запису екрана, які враплять виклики до бінарника ffmpeg, наприклад Blue Recorder. В принципі це те, що мені треба, туди тільки додати кружечок з вебки й аплоад на сервер.
Врешті, через високу складність, цю ідею я закинув.
Потім знову повернувся, з менш амбітною ціллю. Просто зробити клон Loom. Браузер дає високорівневе API яке ховає всі складності.
Давай думаю зроблю апку на електроні. Електрон — вчорашній день, розумні люди написали на расті Tauri, який швидший та компактніший. Ну, думаю, зараз заживемо, на JavaScript я вже точно подужаю зробити задачу.
Розгорнув хеловорлд, згенерував через Claude мінімальну версію запису екрана, запускаю, і… нічого. Дивлюся в чому справа — апка не може запитати дозвіл на запис. Йду на github, щоб дізнатися, що Tauri не підтримує WebRTC і поки що не планує це робити.
Потім я пішов ще раз подивитися, як працює Loom та інші веб-додатки для запису екрану. Мені дуже не сподобалося що воно завжди запитує дозволи та також показує бейджик «ви шарите ваш екран». Я ж хочу нативне рішення, тому відмовився від електрону.
Давай думати далі, я ж Java-розробник? Напевне там щось має бути. Ось JetBrains зробили Compose Multiplatform, візьму його, а вже якесь АРІ в Java має бути. Почав шукати — та ж проблема, є біндинги до ffmpeg якими хз як користуватися.
Якихось притомних бібліотек теж не знайшов — все або старе, або обмежене. Вирішив, що раз на Java тямущого не зможу зробити, то й Kotlin брати не варто.
Ще раз подивився на Loom. Ще раз подивився на ffmpeg.
Зібрав однорядкову команду на ffmpeg, яка записує одночасно відео екрана, вебкамеру та звук з вебкамери в один файл і накладає вебкамеру, власне, на запис екрана.
В цілому можна було б взяти ту програму на Rust, яка врапила бінарник ffmpeg, додати туди аргументів та якось то зліпити докупи, але такий підхід має фатальний недолік — самого кружечка з вебкою воно не показує. Втім, Loom теж цього не робить.
Ніби проста задача — а все тааак складно! Ідеально б мати якесь високорівневе API яке б дозволяло отримувати потрібні відеопотоки та комбінувати їх і відразу стрімити. OBS цю задачу вирішує просто чудово, але виглядає це все абсолютно непідйомно.
Думаю що робити далі.
Update: читач підказав рішення, автори якого вже пройшли увесь шлях та написали нативну апку на Rust: Cap.
Цей текст взято з особистого блогу після отримання дозволу автора.
Favbet Tech – це ІТ-компанія зі 100% українською ДНК, що створює досконалі сервіси для iGaming і Betting з використанням передових технологій та надає доступ до них. Favbet Tech розробляє інноваційне програмне забезпечення через складну багатокомпонентну платформу, яка здатна витримувати величезні навантаження та створювати унікальний досвід для гравців.
Цей матеріал – не редакційний, це – особиста думка його автора. Редакція може не поділяти цю думку.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: