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

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

Дуже проста функція — екран + кружечок з вебкамери + мікрофон. Розумні люди для цього зробили Loom та йому подібні, професіонали користуються OBS.

Але Loom не має апки для лінукса і працює лише як аддон у браузері. Я побачив тут opportunity та подумав — а чому б мені не зробити таку нативну апку? Задача звучить досить просто — іконка в треї, натискаєш на неї — починається запис, натискаєш ще раз — запис завершується і відкривається віконечко з посиланням на твоє відео, яке можна пошарити кому треба.

Чому нативну? В мене є незакритий гештальт. Дуже дратує веб-bloatware.

План був такий — зробити опенсорну апку та закритий сервер. З людей брати гроші за сторедж. Таких проєктів багато, а значить ідея провалідована.

Поліз робити, і...

Виявилося що все не так просто.

Я хотів взяти rust, ui бібліотеку egui, там зробити одну кнопку.

Почав копати як отримати доступ до екрана та вебки, і нічого кращого ніж ffmpeg не знайшов. Для раста є біндинги до ffmpeg, але вони настільки низькорівневі, що їх вивчення не вкладалося в бюджет mvp.

Мені вдалося зробити мікропрототип запису екрана, але я так і не зміг прокинути параметри кодування ffmpeg які регулюють якість і також зіткнувся з несумісністю версій.

Якщо пошукати, то є програми для запису екрана, які враплять виклики до бінарника ffmpeg, наприклад Blue Recorder. В принципі це те, що мені треба, туди тільки додати кружечок з вебки й аплоад на сервер.

Врешті через високу складність цю ідею я закинув.

Потім знову повернувся, з менш амбітною ціллю. Просто зробити клон Loom. Браузер дає високорівневе API яке ховає всі складності.

Давай думаю зроблю апку на електроні. Електрон — вчорашній день, розумні люди написали на расті Tauri, який швидший та компактніший. Ну, думаю, зараз заживемо, на джаваскріпті я вже точно подужаю зробити задачу.

Розгорнув хеловорлд, згенерував через Claude мінімальну версію запису екрана, запускаю, і... нічого. Дивлюся в чому справа — апка не може запитати дозвіл на запис. Йду на github, щоб дізнатися що Tauri не підтримує WebRTC і поки що не планує це робити🤦‍♂️

Потім я пішов ще раз подвитися як працює Loom та інші веб-додатки для запису екрану. Мені дуже не сподобалося що воно завжди запитує дозволи та також показує бейджик «ви шарите ваш екран». Я ж хочу нативне рішення, тому відмовився від електрону.

Давай думати далі, я ж Java-розробник? Напевне там щось має бути. Ось JetBrains зробили Compose Multiplatform, візьму його, а вже якесь АРІ в джаві має бути. Почав шукати — та ж проблема, є біндинги до ffmpeg якими хз як користуватися.

Якихось притомних бібліотек теж не знайшов — все або старе, або обмежене. Вирішив що раз на джаві тямущого не зможу зробити, то й котлін брати не варто.

Ще раз подивився на Loom. Ще раз подивився на ffmpeg.

Зібрав однорядкову команду на ffmpeg яка записує одночасно відео екрана, вебкамеру та звук з вебкамери в один файл і накладає вебкамеру власне на запис екрана.

В цілому можна було б взяти ту програму на расті яка врапила бінарник ffmpeg, додати туди аргументів та якось то зліпити докупи, але такий підхід має фатальний недолік — самого кружечка з вебкою воно не показує. Втім, Loom теж цього не робить.

Ніби проста задача — а все тааак складно! Ідеально б мати якесь високорівневе API яке б дозволяло отримувати потрібні відеопотоки та комбінувати їх і відразу стрімити. OBS цю задачу вирішує просто чудово, але виглядає це все абсолютно непідйомно.

Думаю що робити далі.

update: читач підказав рішення, автори якого вже пройшли увесь шлях та написали нативну апку на расті: Cap.


Сподобалось? Долучайтеся до мого телеграм каналу: https://t.me/full_of_hatred