Рубріки: ДосвідРішення

Захотів зробити апку для скрінкастів

Володимир Рожков

Коли я ще працював на теплій програмістській роботі, то мав потребу записувати короткі відео для користувачів та клієнтів.

Дуже проста функція — екран + кружечок з вебкамери + мікрофон. Розумні люди для цього зробили 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.

Цей текст взято з особистого блогу після отримання дозволу автора.

Якщо ви знайшли помилку, будь ласка, виділіть фрагмент тексту та натисніть Ctrl+Enter.

Останні статті

Недооцінені фішки вашого смартфона, які спрощують життя

Щодня ми носимо в своїй кишені пристрій, що в сотні мільйонів разів потужніший за комп’ютер,…

05.06.2025

В чому різниця між фіксом та «костилем»?

Оце сиджу, працюю і задумався: «А де ж проходить та тонка межа між фіксом, який…

04.06.2025

Закон Гудгарта або як метрики змінюють цінності

«Коли вимірюваний показник стає метою, він перестає бути хорошою мірою» Закон який значною мірою відповідальний…

03.06.2025

Як приймати обдумані рішення за допомогою ChatGPT? Приклади промптів

Інколи здається, що ви врахували все. Упевненість у рішенні настільки висока, що ви вже подумки…

02.06.2025

Чи можете ви програмувати, не дивлячись на екран?

Блогер та розробник Джозеф Круз розповів, як він працює програмістом, маючи доволі серйозні проблеми із…

23.05.2025

Як швидко полегшити головний біль. Три науково доведені способи

Голова може боліти з безлічі причин. Але один з найпоширеніших різновидів — так званий головний…

22.05.2025