Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
flexiondotorg committed Sep 28, 2022
1 parent 087e09b commit 06c4ecd
Showing 10 changed files with 1,128 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
artefacts/obs*
builder/obs-options.sh
214 changes: 214 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
<h1 align="center">
<img src="https://avatars1.githubusercontent.com/u/7725691?v=3&s=256" alt="OBS Studio">
<br />
OBS Studio <i>Portable</i> for Ubuntu
</h1>

<p align="center"><b>Portable builds of OBS Studio for Ubuntu that come pre-loaded with extra features and plugins for live streaming and screen recording</b>
<br />
Made with 💝 for <img src=".github/ubuntu.png" align="top" width="18" /></p>

# OBS Studio Portable for Ubuntu

Running OBS Studio in Portable Mode means that all settings (Profiles and Scene
Collections) are saved within the same directory tree as the OBS Studio
executables, plugins and. You can copy the whole folder to a another computer
and just use it.

- Nearly 40 of the best 3rd Party plugins for OBS Studio are bundled
- Chromium Embedded Frameworks (CEF) to enable Browser Sources
- NVENC (NVIDIA) and VA-API (AMD & Intel) accelerated video encoding
- Fraunhofer FDK AAC Codec
- VLC and GStreamer Media sources
- AJA NTV2 SDK

## Supported Software

Each tarball of OBS Studio Portable includes a `manifest.txt` that describes
exactly which versions are of plugins and add-ons are included.

| Distro | OBS Studio 27 | OBS Studio 28 |
| ------------ | ------------- | ------------- |
| Ubuntu 20.04 | 27.2.4 (Qt 5) | 28.0.2 (Qt 5) |
| Ubuntu 22.04 | 27.2.4 (Qt 5) | 28.0.2 (Qt 6) |
| Ubuntu 22.10 | | 28.0.2 (Qt 6) |

### Caveats

- PipeWire support is not available in builds for Ubuntu 20.04
- Teleport is not available in builds for Ubuntu 20.04
- SRT & RIST Protocol support is only available in builds for Ubuntu 22.10 and newer

# Install

The install process is simple:

- Download the tarball (and sha256 hash) of OBS Studio for the version of Ubuntu you're running.
- **Builds are specific to an Ubuntu release!**
- Extract the tarball somewhere.
- Run `obs-dependencies`, include in the tarball, to make sure the runtime requirements for OBS Studio are satisfied.
- Run `obs-portable` to launch OBS Studio.
- **It is essential you use `obs-portable` to launch OBS Studio** to ensure it finds all the associated libraries and add-ons.

```bash
wget "https://github.com/wimpysworld/obs-portable/releases/download/r22271/obs-portable-28.0.2-r22271-ubuntu-22.04.tar.bz2"
sha256sum -c obs-portable-28.0.2-r22271-ubuntu-22.04.tar.bz2.sha256
tar xvf obs-portable-28.0.2-r22271-ubuntu-22.04.tar.bz2
cd obs-portable-28.0.2-r22271-ubuntu-22.04
sudo ./obs-dependencies
./obs-portable
```

You can safely install these OBS Studio Portable builds alongside `.deb`,
FlatPak or Snap installs of OBS Studio.

## Upgrades

The upgrade process is the same as an install and you can simply copy the
`config` folder from your old OBS Studio Portable directory to the new one. If
anything doesn't correctly when you start the new OBS Studio, just keep using
the previous OBS Studio Portable instance.

# Why does this project exist?

If any of the following is true for you, you might find these builds of OBS
Studio useful.

- **I want a version of OBS Studio for Ubuntu that has all the features enabled, *by default***
- I use lots of 3rd party OBS Studio plugins in my stream configuration.
- **I stream from two different locations using multiple computers**
- [Syncthing](https://syncthing.net/) keeps most of my streaming configuration synced between sites, but I'd like to include OBS Studio itself.
- **I sometimes make changes to my OBS Studio configuration from various computers**
- Keeping these changes in sync manually can be cumbersome. But now I can automate that with [Syncthing](https://syncthing.net/).
- **I stream to multiple channels**
- Having discrete OBS Studio instances is easier to work with than switching between dozens of Profile and Scene Collection combinations.
- **I don't want to deal with flag day releases of new software**
- New software is wonderful, but I'd like more control over when and how I upgrade each of my streaming configuration instances.
- **My stream integrations are not (currently) compatible with confined packages of OBS Studio**
- I have some funky stream integrations, and will likely create more.
- **I sometimes stream how to do stuff with OBS Studio**
- Being able to run demo instances of OBS Studio with isolated configurations is great for this.
- **I want a stable streaming setup and an WIP streaming setup**
- When developing new features for my stream, I want to freely experiment with new versions of OBS Studio and plugins without fear of breaking my stable setup.
- **I sometimes need old and new version of OBS Studio available**
- I have some streaming projects that are archived and do not need upgrading, but I do want to reference from time to time.

# Batteries included

I am extremely thankful to the OBS Studio developers and developers of the
growing list of excellent plugins. The Portable build of OBS Studio for Ubuntu
celebrate the best of what is available. Thank you! 🙇

Here are the 3rd party plugins that come bundled with OBS Studio Portable for
Ubuntu:

## Audio

* **[Audio Pan](https://github.com/norihiro/obs-audio-pan-filter)** plugin; control stereo pan of audio source.
* **[Mute Filter](https://github.com/norihiro/obs-mute-filter)**plugin; to mute audio of a source.
* **[PipeWire Audio Capture](https://github.com/dimtpap/obs-pipewire-audio-capture)** plugin; capture application audio from PipeWire.
* **[Scale to Sound](https://github.com/Qufyy/obs-scale-to-sound)** plugin; adds a filter which makes a source scale based on the audio levels of any audio source you choose
* **[Soundboard](https://github.com/cg2121/obs-soundboard)** plugin; adds a soundboard dock.
* **[Waveform](https://github.com/phandasm/waveform)** plugin; audio spectral analysis.

## Automation

* **[Advanced Scene Switcher](https://github.com/WarmUpTill/SceneSwitcher)** plugin; an automated scene switcher.
* **[Directory Watch Media](https://github.com/exeldro/obs-dir-watch-media)** plugin; filter you can add to media source to load the oldest or newest file in a directory.
* **[Dummy Source](https://github.com/norihiro/obs-command-source)** plugin; provides a dummy source to execute arbitrary commands when scene is switched.
* **[Source Switcher](https://github.com/exeldro/obs-source-switcher)** plugin; to switch between a list of sources.
* **[Transition Table](https://github.com/exeldro/obs-transition-table)** plugin; customize scene transitions.
* **[Websockets](https://github.com/Palakis/obs-websocket)** plugin; remote-control OBS Studio through WebSockets.
* **Also includes the *4.91 compatibility* version**

## Effects

* **[DVD Screensaver](https://github.com/univrsal/dvds3)** plugin; a DVD screen saver source type.
* **[Downstream Keyer](https://github.com/exeldro/obs-downstream-keyer)** plugin; add a Downstream Keyer dock.
* **[Dynamic Delay](https://github.com/exeldro/obs-dynamic-delay)** plugin; filter for dynamic delaying a video source.
* **[Freeze Filter](https://github.com/exeldro/obs-freeze-filter)** plugin; freeze a source using a filter.
* **[Gradient Source](https://github.com/exeldro/obs-gradient-source)** plugin; adding gradients as a Source.
* **[Move Transition](https://github.com/exeldro/obs-move-transition)** plugin; move source to a new position during scene transition.
* **[Multi Source Effect](https://github.com/norihiro/obs-multisource-effect)** plugin; provides a custom effect to render multiple sources.
* **[Recursion Effect](https://github.com/exeldro/obs-recursion-effect)** plugin; recursion effect filter.
* **[Replay Source](https://github.com/exeldro/obs-replay-source)** plugin; slow motion replay async sources from memory.
* **[RGB Levels](https://github.com/petrifiedpenguin/obs-rgb-levels-filter)** plugin; simple filter to adjust RGB levels.
* **[Time Shift](https://github.com/exeldro/obs-time-shift)** plugin; time shift a source using a filter.
* **[Time Warp Scan](https://github.com/exeldro/obs-time-warp-scan)** plugin; a time warp scan filter.

## Encoding & Output

* **[GStreamer](https://github.com/fzwoch/obs-gstreamer)** plugins; feed GStreamer launch pipelines into OBS Studio.
* **[Source Record](https://github.com/exeldro/obs-source-record)** plugin; make sources available to record via a filter.
* **[StreamFX](https://github.com/Xaymar/obs-StreamFX)** plugin; unlocks the fully potential of NVENC.
* **[Teleport](https://github.com/fzwoch/obs-teleport)** plugin; open NDI-like replacement. (*not NDI compatible*)
* **[VAAPI](https://github.com/exeldro/obs-transition-table)** plugin; GStreamer based VAAPI encoder implementation.
* **[Virtual Cam Filter](https://github.com/exeldro/obs-virtual-cam-filter)** plugin; make sources available to the virtual camera via a filter

## Tools

* **[Scene Collection Manager](https://github.com/exeldro/obs-scene-collection-manager)** plugin; filter, backup and restore Scene Collections.
* **[Scene Notes Dock](https://github.com/exeldro/obs-scene-notes-dock)** plugin; create a Dock for showing and editing notes for the current active scene.
* **[Source Copy](https://github.com/exeldro/obs-source-copy)** plugin; adds copy and paste options to the tools menu.
* **[Source Dock](https://github.com/exeldro/obs-source-dock)** plugin; create a Dock for a source, which lets you see audio levels, change volume and control media.

## Text

* **[Text Pango](https://github.com/kkartaltepe/obs-text-pango)** plugin; Provides a text source rendered using Pango with multi-language support, emoji support, vertical rendering and RTL support.
* **[Text PThread](https://github.com/norihiro/obs-text-pthread)** plugin; Rich text source plugin with many advanced features.

### Additional plugins

If the builds of OBS Studio offered here don't include a plugin that you use,
you can download a pre-compiled version and add it to the portable folder:

- Put any `.so` files in `obs-plugins/64bit`
- Put any data files associated with the plugin in `data/obs-plugins/<plugin name>/`

## OBS Virtual Camera

OBS Studio Virtual Camera support is integrated. The `Start Virtual Camera`
button is located in the Controls pane, just below `Start Recording`. Here's how
to install and configure `v4l2loopback` which OBS uses:

```bash
echo 'options v4l2loopback devices=1 video_nr=13 card_label="OBS Virtual Camera" exclusive_caps=1' | sudo tee /etc/modprobe.d/v4l2loopback.conf
echo "v4l2loopback" | sudo tee /etc/modules-load.d/v4l2loopback.conf
sudo modprobe -r v4l2loopback
sudo modprobe v4l2loopback devices=1 video_nr=13 card_label="OBS Virtual Camera" exclusive_caps=1
```

**NOTE!** Using `video_nr` greater than 64 will not work.

# Wayland

Browser docks and streaming service integrations are currently disabled on
Wayland due to Chromium Embedded Framework (CEF) issues. If you need browser
docks or stream service integrations, click on the cog icon when logging into
Ubuntu and select "ubuntu on xorg".

Alternatively you can coerce OBS Studio to run via Xwayland without changing the
desktop session:

```bash
env QT_QPA_PLATFORM=xcb ./obs-portable
```

# Build process

Each build is compiled in a freshly provisioned systemd container. The, somewhat
hastily thrown together, *"build scripts"* are included in this repository.

The `build-*.sh` scripts are wrappers to help automate things, with
[`build-auto.sh`](./build-auto.sh) being the main entry point.

The actual build script, [`obs-portable.sh`](builder/obs-portable.sh), gets
injected into the new container and is responsible for actually building OBS
Studio. Perhaps it might also serve as a reference for users of other Linux
distributions who want to create their own portable builds of OBS Studio.

# References

- https://obsproject.com/wiki/Build-Instructions-For-Linux
- https://github.com/snapcrafters/obs-studio
- https://launchpad.net/~obsproject
Empty file added artefacts/.gitkeep
Empty file.
30 changes: 30 additions & 0 deletions build-auto.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/env bash

if [ -z "${SUDO_USER}" ]; then
echo "ERROR! You must use sudo to run this script: sudo ./$(basename "${0}")"
exit 1
else
SUDO_HOME=$(getent passwd "${SUDO_USER}" | cut -d: -f6)
fi

if [ -z "${1}" ]; then
echo "Usage: $(basename "${0}") <codename>"
exit 1
fi
DISTRO="${1}"

case "${DISTRO}" in
focal|jammy|kinetic) true;;
*) echo "ERROR! Unknown Ubuntu release: ${DISTRO}"
exit 1;;
esac

for OBS_VER in 27 28; do
if [ "${DISTRO}" == "kinetic" ] && [ "${OBS_VER}" == "27" ]; then
continue
fi
./build-trash.sh "${DISTRO}"
./build-bootstrap.sh "${DISTRO}"
./build-enter.sh "${DISTRO}" "/root/obs-portable.sh ${OBS_VER}"
./build-get-artefacts.sh "${DISTRO}" "${OBS_VER}"
done
57 changes: 57 additions & 0 deletions build-bootstrap.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/usr/bin/env bash

if [ -z "${SUDO_USER}" ]; then
echo "ERROR! You must use sudo to run this script: sudo ./$(basename "${0}")"
exit 1
else
SUDO_HOME=$(getent passwd "${SUDO_USER}" | cut -d: -f6)
fi

if [ -z "${1}" ]; then
echo "Usage: $(basename "${0}") <codename>"
exit 1
fi

DISTRO="${1}"
case "${DISTRO}" in
focal|jammy|kinetic) true;;
*) echo "ERROR! Unknown version: ${DISTRO}"
exit 1
;;
esac
R="${SUDO_HOME}/Builds/obs-builder-${DISTRO}"

if [ ! -d "${R}" ]; then
apt-get -y install debootstrap systemd-container debian-archive-keyring ubuntu-keyring

if pidof apt-cacher-ng; then
REPO="http://localhost:3142/gb.archive.ubuntu.com/ubuntu/"
else
REPO="http://gb.archive.ubuntu.com/ubuntu/"
fi

debootstrap \
--components=main,restricted,universe,multiverse \
--exclude=ubuntu-minimal,ubuntu-advantage-tools \
--include=nano,systemd-container \
"${DISTRO}" "${R}" "${REPO}"

# Make sure the container has a machine-id
systemd-machine-id-setup --root "${R}" --print
echo "127.0.0.1 localhost ${DISTRO}" > "${R}/etc/hosts"

# Set locale to C.UTF-8 by default.
# https://git.launchpad.net/livecd-rootfs/tree/live-build/auto/build#n159
echo "LANG=C.UTF-8" > "${R}/etc/default/locale"

echo "
deb http://gb.archive.ubuntu.com/ubuntu/ ${DISTRO} main restricted universe multiverse
deb http://gb.archive.ubuntu.com/ubuntu/ ${DISTRO}-updates main restricted universe multiverse
deb http://gb.archive.ubuntu.com/ubuntu/ ${DISTRO}-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu ${DISTRO}-security main restricted universe multiverse" > "${R}/etc/apt/sources.list"
else
echo "WARNING! ${R} already exists!"
echo " Updating OBS build scripts only."
fi

cp builder/*.sh "${R}/root/"
6 changes: 6 additions & 0 deletions build-check-artefacts.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/usr/bin/env bash

cd artefacts
for SHA_FILE in *.sha256; do
sha256sum -c "${SHA_FILE}"
done
48 changes: 48 additions & 0 deletions build-enter.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#!/usr/bin/env bash

if [ -z "${SUDO_USER}" ]; then
echo "ERROR! You must use sudo to run this script: sudo ./$(basename "${0}")"
exit 1
else
SUDO_HOME=$(getent passwd "${SUDO_USER}" | cut -d: -f6)
fi

if [ -z "${1}" ]; then
echo "Usage: $(basename "${0}") <codename>"
exit 1
fi
DISTRO="${1}"

if [ -n "${2}" ]; then
CMD="${2}"
else
CMD="/bin/bash"
fi

case "${DISTRO}" in
focal|jammy|kinetic) true;;
*) echo "ERROR! Unknown version: ${DISTRO}"
exit 1
;;
esac

R="${SUDO_HOME}/Builds/obs-builder-${DISTRO}"
APT_CACHE_IP=$(ip route get 1.1.1.1 | head -n 1 | cut -d' ' -f 7)

if pidof -q apt-cacher-ng && [ -d "${R}/etc/apt/apt.conf.d" ]; then
echo "Acquire::http { Proxy \"http://${APT_CACHE_IP}:3142\"; }" > "${R}/etc/apt/apt.conf.d/90cache"
fi

echo "nameserver 1.1.1.1" > "/tmp/resolv-${DISTRO}.conf"
systemd-nspawn \
--bind-ro="/tmp/resolv-${DISTRO}.conf":/etc/resolv.conf \
--chdir=/root \
--directory "${R}" \
--hostname="${DISTRO}" \
--machine="${DISTRO}" \
--resolv-conf=off \
${CMD}

if [ -e "${R}/etc/apt/apt.conf.d/90cache" ]; then
rm -f "${R}/etc/apt/apt.conf.d/90cache"
fi
35 changes: 35 additions & 0 deletions build-get-artefacts.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/usr/bin/env bash

if [ -z "${SUDO_USER}" ]; then
echo "ERROR! You must use sudo to run this script: sudo ./$(basename "${0}")"
exit 1
else
SUDO_HOME=$(getent passwd "${SUDO_USER}" | cut -d: -f6)
fi

if [ -z "${1}" ] || [ -z "${2}" ]; then
echo "Usage: $(basename "${0}") <codename> <obs_ver>"
exit 1
fi

DISTRO="${1}"
OBS_VER="${2}"

case "${DISTRO}" in
focal) DISTRO_VER="20.04";;
jammy) DISTRO_VER="22.04";;
kinetic) DISTRO_VER="22.10";;
*) echo "ERROR! Unknown Ubuntu release: ${DISTRO}"
exit 1;;
esac

case "${OBS_VER}" in
27|28) true;;
*) echo "ERROR! Unsupported OBS Studio version: ${OBS_VER}"
exit 1;;
esac

if [ -d "${SUDO_HOME}/Builds/obs-builder-${DISTRO}/root/obs-${OBS_VER}" ]; then
cp -v "${SUDO_HOME}/Builds/obs-builder-${DISTRO}/root/obs-${OBS_VER}"/obs-portable-${OBS_VER}*-ubuntu-${DISTRO_VER}.* artefacts/
chown "${SUDO_USER}":"${SUDO_USER}" artefacts/obs-portable-${OBS_VER}*-ubuntu-${DISTRO_VER}.*
fi
26 changes: 26 additions & 0 deletions build-trash.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/usr/bin/env bash

if [ -z "${SUDO_USER}" ]; then
echo "ERROR! You must use sudo to run this script: sudo ./$(basename "${0}")"
exit 1
else
SUDO_HOME=$(getent passwd "${SUDO_USER}" | cut -d: -f6)
fi

if [ -z "${1}" ]; then
echo "Usage: $(basename "${0}") <codename>"
exit 1
fi

DISTRO="${1}"
case "${DISTRO}" in
focal|jammy|kinetic) true;;
*) echo "ERROR! Unknown version: ${DISTRO}"
exit 1
;;
esac

R="${SUDO_HOME}/Builds/obs-builder-${DISTRO}"
if [ -d "${R}" ]; then
rm -rf "${R}"
fi
710 changes: 710 additions & 0 deletions builder/obs-portable.sh

Large diffs are not rendered by default.

0 comments on commit 06c4ecd

Please sign in to comment.