From a051c8ec13d3e0c066801ae91ab803fb33e5c365 Mon Sep 17 00:00:00 2001 From: Scott Worley Date: Mon, 6 Oct 2025 00:01:42 -0700 Subject: [PATCH 1/1] Implement camera sharing --- srec.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/srec.py b/srec.py index 0828310..7421c74 100644 --- a/srec.py +++ b/srec.py @@ -11,6 +11,7 @@ from datetime import datetime import os import subprocess import sys +import time from typing import Any, Callable import gi @@ -42,6 +43,7 @@ class Stream: recording: Stream | None = None +sharing: Stream | None = None def make_filename() -> str: @@ -56,9 +58,18 @@ def make_filename() -> str: def video_source(stack: Gtk.Stack) -> list[str]: if stack.get_child_by_name('not_recording').get_first_child().get_active(): return ['-f', 'x11grab', '-i', ':0.0+0,0'] + if is_sharing_enabled(stack): + return ['-f', 'v4l2', '-i', '/dev/video9'] return ['-f', 'v4l2', '-i', '/dev/video0'] +def is_sharing_enabled(stack: Gtk.Stack) -> bool: + enabled = stack.get_child_by_name('not_recording').get_first_child( + ).get_next_sibling().get_next_sibling().get_active() + assert isinstance(enabled, bool) + return enabled + + def find_size_display(stack: Gtk.Stack) -> Gtk.Label: return stack.get_child_by_name( 'recording').get_first_child().get_next_sibling() @@ -90,23 +101,34 @@ def begin_monitoring_file_size(size_display: Gtk.Label, filename: str) -> None: def on_start_recording(_: Gtk.Button, stack: Gtk.Stack) -> None: - global recording # pylint: disable=global-statement + global recording, sharing # pylint: disable=global-statement assert recording is None + assert sharing is None filename = make_filename() begin_monitoring_file_size(find_size_display(stack), filename) + stack.set_visible_child_name("recording") + + if is_sharing_enabled(stack): + sharing = Stream.start( + ['ffmpeg', '-i', '/dev/video0', '-f', 'v4l2', '-framerate', '25', + '-codec:v', 'rawvideo', '-pix_fmt', 'yuv420p', '/dev/video9']) + time.sleep(3) # Bad!! We should not be sleeping in this thread! + recording = Stream.start( ['ffmpeg', '-framerate', '25'] + video_source(stack) + ['-f', 'pulse', '-ac', '2', '-i', 'default', filename]) - stack.set_visible_child_name("recording") def on_stop_recording(_: Gtk.Button, stack: Gtk.Stack) -> None: - global recording # pylint: disable=global-statement + global recording, sharing # pylint: disable=global-statement assert recording is not None recording.stop() recording = None + if sharing is not None: + sharing.stop() + sharing = None stack.set_visible_child_name("not_recording") -- 2.50.1