From 0d5c5cc5b437db3c4e661c0aff22c5d11a3d570d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Tue, 9 Apr 2024 14:58:06 -0700 Subject: [PATCH] examples: add 14a-local-render-remote-participant --- examples/foundational/03a-image-local.py | 2 +- .../14-render-remote-participant.py | 6 +- .../14a-local-render-remote-participant.py | 72 +++++++++++++++++++ 3 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 examples/foundational/14a-local-render-remote-participant.py diff --git a/examples/foundational/03a-image-local.py b/examples/foundational/03a-image-local.py index 46f811471..b98d0dc76 100644 --- a/examples/foundational/03a-image-local.py +++ b/examples/foundational/03a-image-local.py @@ -5,7 +5,7 @@ import tkinter as tk -from dailyai.pipeline.frames import TextFrame, EndFrame +from dailyai.pipeline.frames import TextFrame from dailyai.pipeline.pipeline import Pipeline from dailyai.services.fal_ai_services import FalImageGenService from dailyai.transports.local_transport import LocalTransport diff --git a/examples/foundational/14-render-remote-participant.py b/examples/foundational/14-render-remote-participant.py index 1802bd037..567134a20 100644 --- a/examples/foundational/14-render-remote-participant.py +++ b/examples/foundational/14-render-remote-participant.py @@ -4,8 +4,6 @@ from typing import AsyncGenerator -from PIL import Image - from dailyai.pipeline.aggregators import FrameProcessor from dailyai.pipeline.frames import ImageFrame, Frame, UserImageFrame @@ -32,7 +30,7 @@ async def process_frame(self, frame: Frame) -> AsyncGenerator[Frame, None]: yield frame -async def main(room_url): +async def main(room_url: str, token): transport = DailyTransport( room_url, token, @@ -53,4 +51,4 @@ async def on_first_other_participant_joined(transport, participant): if __name__ == "__main__": (url, token) = configure() - asyncio.run(main(url)) + asyncio.run(main(url, token)) diff --git a/examples/foundational/14a-local-render-remote-participant.py b/examples/foundational/14a-local-render-remote-participant.py new file mode 100644 index 000000000..979b19f9d --- /dev/null +++ b/examples/foundational/14a-local-render-remote-participant.py @@ -0,0 +1,72 @@ +import asyncio +import io +import logging +import tkinter as tk + +from typing import AsyncGenerator + +from dailyai.pipeline.aggregators import FrameProcessor + +from dailyai.pipeline.frames import ImageFrame, Frame, UserImageFrame +from dailyai.pipeline.pipeline import Pipeline +from dailyai.transports.daily_transport import DailyTransport + +from dailyai.transports.local_transport import LocalTransport +from runner import configure + +from dotenv import load_dotenv +load_dotenv(override=True) + +logging.basicConfig(format=f"%(levelno)s %(asctime)s %(message)s") +logger = logging.getLogger("dailyai") +logger.setLevel(logging.DEBUG) + + +class UserImageProcessor(FrameProcessor): + + async def process_frame(self, frame: Frame) -> AsyncGenerator[Frame, None]: + if isinstance(frame, UserImageFrame): + yield ImageFrame(frame.image, frame.size) + else: + yield frame + + +async def main(room_url: str, token): + tk_root = tk.Tk() + tk_root.title("dailyai") + + local_transport = LocalTransport( + tk_root=tk_root, + camera_enabled=True, + camera_width=1280, + camera_height=720 + ) + + transport = DailyTransport( + room_url, + token, + "Render participant video", + video_rendering_enabled=True + ) + + @transport.event_handler("on_first_other_participant_joined") + async def on_first_other_participant_joined(transport, participant): + transport.render_participant_video(participant["id"]) + + async def run_tk(): + while not transport._stop_threads.is_set(): + tk_root.update() + tk_root.update_idletasks() + await asyncio.sleep(0.1) + + local_pipeline = Pipeline([UserImageProcessor()], source=transport.receive_queue) + + await asyncio.gather( + transport.run(), + local_transport.run(local_pipeline, override_pipeline_source_queue=False), + run_tk() + ) + +if __name__ == "__main__": + (url, token) = configure() + asyncio.run(main(url, token))