102 lines
7.4 KiB
Markdown
102 lines
7.4 KiB
Markdown
# OBS WebKit Browser Source (без CEF)
|
||
|
||
Нативный input source для OBS Studio на Alpine Linux. Страницы рендерит системный
|
||
WebKitGTK 4.1 в отдельном процессе; Chromium/CEF и Xvfb в проекте нет. Renderer
|
||
использует X11/XWayland-сессию OBS и держит WebView в полностью прозрачном
|
||
неинтерактивном нативном окне. Нативная surface нужна WebKitGTK для импорта GPU
|
||
DMA-BUF. Кадры передаются в OBS напрямую как BGRA, без FFmpeg и захвата рабочего
|
||
стола.
|
||
|
||
Поддерживается:
|
||
|
||
- HTTP/HTTPS, `data:` URL и локальные HTML-файлы;
|
||
- прозрачный фон с alpha-каналом;
|
||
- пользовательский CSS;
|
||
- масштаб страницы 25–500% с сохранением в настройках источника или web-панели;
|
||
- опциональный захват звука каждого browser source в отдельную полосу Audio Mixer OBS;
|
||
- размер 2–8192 px и 1–60 FPS;
|
||
- аппаратный WebKit compositor через DRM/DMA-BUF (Mesa `radeonsi` на AMD);
|
||
- прямой XComposite/XShm-захват скомпозированного GPU-кадра с alpha;
|
||
- XDamage-пропуск чтения backing pixmap, пока содержимое страницы не меняется;
|
||
- shared-memory транспорт кадров без многомегабайтной записи в pipe;
|
||
- мышь, прокрутка, фокус и базовый ввод с клавиатуры через окно Interact OBS;
|
||
- перезагрузка страницы и остановка renderer-процесса у скрытого source.
|
||
- пользовательские web-панели в меню «Док-панели» OBS с сохранением URL в
|
||
коллекции сцен, восстановлением после запуска и интерактивным вводом.
|
||
- единый постоянный WebKit-профиль для источников на сцене и web-панелей: общие
|
||
cookies, HTTP cache, localStorage, IndexedDB, service workers и credentials;
|
||
страницы одного origin взаимодействуют штатными `storage`-событиями и
|
||
`BroadcastChannel`, как вкладки одного браузера.
|
||
|
||
Захват звука по умолчанию выключен. Включите «Захватывать звук браузера» в
|
||
настройках нужного источника; его громкость появится отдельной полосой в Audio Mixer OBS.
|
||
Для захвата требуется работающий PulseAudio-совместимый сервер (в том числе
|
||
PipeWire Pulse) и GStreamer `pulsesink`; скрипт установки зависимостей добавляет
|
||
необходимый пакет `gst-plugins-good`.
|
||
Все WebView одной сессии OBS работают в общем renderer-процессе и одном
|
||
`WebKitWebContext`; маленькие процессы-посредники сохраняют прежнюю независимую
|
||
жизнь каждого source/dock и изоляцию от OBS. Профиль хранится в стандартных каталогах
|
||
данных и cache пользователя (`obs-webkit-browser/profile`) и переживает перезапуск OBS.
|
||
Renderer наследует X11/XWayland-дисплей OBS; его нативное окно имеет нулевую opacity,
|
||
пустую input shape и не появляется на рабочем столе. Дополнительный display server не
|
||
запускается. WebKit принудительно включает аппаратный compositor и выбирает доступный
|
||
DRM render node; для него нужен доступ к `/dev/dri/renderD*`.
|
||
Для тяжёлого полноэкранного `filter: blur()` всё ещё разумно выбирать реальный размер
|
||
виджета вместо рендера 4K/1080p с последующим уменьшением в сцене. Пользовательские
|
||
`will-change` и compositor hints сохраняются, но renderer не внедряет их в страницу сам:
|
||
WebKit сам распределяет элементы по GPU-слоям.
|
||
|
||
Это рабочий backend, а не замена всех расширенных возможностей штатного obs-browser
|
||
(DevTools, cookies API и DRM здесь пока отсутствуют).
|
||
|
||
## Сборка на Alpine
|
||
|
||
```sh
|
||
chmod +x scripts/install-deps-alpine.sh
|
||
./scripts/install-deps-alpine.sh
|
||
/usr/bin/cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
|
||
/usr/bin/cmake --build build
|
||
ctest --test-dir build --output-on-failure
|
||
doas /usr/bin/cmake --install build --prefix /usr
|
||
```
|
||
|
||
После установки перезапустите OBS и добавьте источник **Браузер WebKit**.
|
||
Для панели откройте **Док-панели → Пользовательские web-панели...**, добавьте
|
||
название и URL и нажмите **Применить**. Панель можно скрывать и показывать через
|
||
обычное меню доков OBS; правый клик по странице открывает команду перезагрузки.
|
||
Если OBS установлен в нестандартный prefix, задайте при конфигурации
|
||
`OBS_PLUGIN_DIR` и `OBS_PLUGIN_DATA_DIR`.
|
||
|
||
## Архив для публикации
|
||
|
||
После установки зависимостей используйте отдельные цели `Makefile`:
|
||
|
||
```sh
|
||
make build
|
||
make test
|
||
doas make install
|
||
make archive
|
||
```
|
||
|
||
`make build` собирает Release-версию, `make test` запускает тесты,
|
||
`doas make install` устанавливает плагин в `/usr`, а `make archive` запускает
|
||
сборку и тесты, после чего создаёт пакет без установки файлов в систему.
|
||
Готовый архив `obs-webkit-browser-<version>-linux-<arch>.tar.gz` и файл с его
|
||
SHA-256 будут записаны в каталог `dist/`. Внутри нет абсолютных путей: архив
|
||
содержит только пользовательскую структуру плагина
|
||
`obs-webkit-browser/{bin/64bit,data}`. Установить её можно напрямую в каталог
|
||
пользовательских плагинов OBS:
|
||
|
||
```sh
|
||
mkdir -p ~/.config/obs-studio/plugins
|
||
tar -xzf dist/obs-webkit-browser-<version>-linux-<arch>.tar.gz \
|
||
-C ~/.config/obs-studio/plugins
|
||
```
|
||
|
||
## Почему WebKitGTK, а не WPE
|
||
|
||
WPE архитектурно подходит лучше всего, но пакет `wpewebkit` отсутствует в актуальном
|
||
Alpine edge/3.24 (остались только `libwpe` и backend). WebKitGTK 4.1 есть в текущем
|
||
репозитории Alpine, использует тот же WebKit и не зависит от CEF. Renderer изолирован
|
||
от OBS, поэтому падение Web-процесса не должно уронить студию.
|