From f5becdd2c03533521c9033d076b2e20ea208aec3 Mon Sep 17 00:00:00 2001 From: Alex Southwell Date: Sat, 24 Oct 2026 22:33:11 +0000 Subject: [PATCH] Document real OBS Media Source verification (#175) * Document real OBS Media Source video and audio verification * Record packaged OBS Start and Stop headset check --------- Co-authored-by: SAPHID --- CHANGELOG.md | 5 +- .../obs-media-source-real-2026-10-25.md | 48 +++++++++++++++++++ docs/obs-headset-source.md | 13 ++--- 3 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 docs/evidence/obs-media-source-real-2026-10-25.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 038916b..570f9c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,9 @@ - Bundle the OBS source helper in Linux and macOS installers and add a **Capture & Live** Start/Stop control. The app selects the active Frame and - closes its SSH stream on a headset switch or app exit. OBS playback and audio - sync remain unverified. [Setup and limits](docs/obs-headset-source.md). + closes its SSH stream on a headset switch or app exit. A real Frame stream + reached OBS with video and non-silent audio; listening and sync remain + unverified. [Setup and limits](docs/obs-headset-source.md). - Add a source-checkout helper that sends the Frame's SteamVR mirror and default-output audio to a local OBS Media Source. A real Frame supplied a diff --git a/docs/evidence/obs-media-source-real-2026-10-25.md b/docs/evidence/obs-media-source-real-2026-10-25.md new file mode 100644 index 0000000..b53263e --- /dev/null +++ b/docs/evidence/obs-media-source-real-2026-10-25.md @@ -0,0 +1,48 @@ +# OBS Media Source on a real Frame, 2026-10-25 AEDT + +The Linux x86_64 AppImage from PR #174's exact head `69fff152` had SHA-256 +`4902ac80b77fbf98ec918db29df9cf9260b8abd6763a5b5055572335869f038a`. +Its extracted resources passed `app/build/check-resources.js`, including the +OBS helper, and the app launched under Xvfb with an isolated profile and a +dummy SSH alias. Its bundled server served the page with HTTP 200. + +For the device test, the PC was lxso2. The real Frame was reached as `ssh frame` +under an atomically acquired `/tmp/frame-test.lock`. Battery read 100% Full +before and after. SteamVR 2.18.2 reported `activity_level: 3` (standby). The +mirror service and `/dev/video99` were active. The test cleaned its temporary +remote WAV and released only its own lock. + +OBS 30.0.2 ran in a disposable Ubuntu 24.04 container on lxso2, with Xvfb and +host loopback networking. A Media Source opened `udp://127.0.0.1:15099` with +input format `mpegts`. A synthetic pattern and tone first verified the OBS +scene: its saved 43.733-second MKV had H.264 video and AAC audio with a +`-17.9 dB` audio peak. The real Frame test then ran the helper from the +extracted AppImage resources **before** OBS opened the source, so OBS joined +an ongoing stream. OBS's saved 37.600-second MKV had H.264 video and AAC audio. +The standby mirror appeared in decoded frames by five seconds. A 440 Hz tone +played briefly to the Frame's default PulseAudio output appeared in the OBS +audio recording at seconds 20–21; decoded audio peaked at `-34.4 dB`. A +separate direct recording of `@DEFAULT_MONITOR@` during the same type of tone +peaked at `-34.5 dB`. These measurements verify non-silent headset output +audio passed through the helper and OBS into the saved recording. + +The first OBS attempt opened its Media Source well before the Frame sent +packets. Its output had a silent AAC track until the mirror appeared late. +Starting the helper before OBS fixed this in the second run. The setup guide +now recommends starting the source in Frame Control before adding or activating +the OBS Media Source. + +The exact-head AppImage was then launched on an isolated Xvfb display and +profile with the real `frame` alias. In **Tools → Capture & Live**, clicking +**Start OBS source** changed the UI to **Stop OBS source** and showed +`udp://127.0.0.1:15099` after the first stream packet. The packaged Python +helper was running with `--frame frame`. Clicking **Stop OBS source** returned +the UI to **Start OBS source**; the helper and its remote `/dev/video99` ffmpeg +process were gone. The app exited through **File → Quit**. Battery again read +100% Full, and the owned lock was released. + +**Limits:** Nobody listened to OBS audio monitoring or the Frame speakers. +Audio/video sync was not measured. The headset was unworn and in standby, so +this test does not answer whether active passthrough pixels appear in the +mirror. The OBS MKVs were temporary local test artifacts and are not included +in the repository. diff --git a/docs/obs-headset-source.md b/docs/obs-headset-source.md index 3c5baef..32a7ac1 100644 --- a/docs/obs-headset-source.md +++ b/docs/obs-headset-source.md @@ -38,9 +38,10 @@ This is the composited, undistorted one-eye **SteamVR mirror**, not a raw passthrough camera feed. The mirror may be blank when the headset is idle or unworn. Whether active passthrough pixels appear in it is still unverified. The helper does not send a microphone. It is designed for one local OBS -receiver. **Verified 2026-10-24:** against a real Frame running SteamOS 0.5.6, -build 20261022.6153909, the receiver saved a 4.021-second MPEG-TS sample on -the Linux PC; `ffprobe` found H.264 video and AAC audio. The temporary sample -was removed. The headset was unworn, so visible content and audible sound were -not checked. OBS itself was not installed on that PC; its Media Source setup, -monitoring and sync are still unverified. +receiver. **Verified 2026-10-25:** the helper bundled in the Linux AppImage +sent a real Frame stream to OBS 30's Media Source. OBS recorded 37.6 seconds +with H.264 video and AAC audio; a brief 440 Hz tone played to the Frame's +default output was present in the saved audio. The headset was in standby, so +the video showed the standby mirror. Nobody listened to OBS's monitoring output, +and audio/video sync and active passthrough remain unverified. See the +[test evidence](evidence/obs-media-source-real-2026-10-25.md).