diff --git a/CHANGELOG.md b/CHANGELOG.md index 1189d046b..2eb958215 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Other +- Added examples `foundational/18-gstreamer-filesrc.py` and + `foundational/18a-gstreamer-videotestsrc.py` that show how to use + `GStreamerPipelineSource` + - Remove `requests` library usage. - Cleanup examples and use `DailyRESTHelper`. diff --git a/examples/foundational/18-gstreamer-filesrc.py b/examples/foundational/18-gstreamer-filesrc.py new file mode 100644 index 000000000..4b04dcf92 --- /dev/null +++ b/examples/foundational/18-gstreamer-filesrc.py @@ -0,0 +1,78 @@ +# +# Copyright (c) 2024, Daily +# +# SPDX-License-Identifier: BSD 2-Clause License +# + +import asyncio +import aiohttp +import argparse +import sys + +from pipecat.pipeline.pipeline import Pipeline +from pipecat.pipeline.runner import PipelineRunner +from pipecat.pipeline.task import PipelineTask +from pipecat.processors.gstreamer.pipeline_source import GStreamerPipelineSource +from pipecat.transports.services.daily import DailyParams, DailyTransport + +from runner import configure_with_args + +from loguru import logger + +from dotenv import load_dotenv +load_dotenv(override=True) + +logger.remove(0) +logger.add(sys.stderr, level="DEBUG") + + +async def main(): + async with aiohttp.ClientSession() as session: + parser = argparse.ArgumentParser(description="Daily AI SDK Bot Sample") + parser.add_argument( + "-i", + "--input", + type=str, + required=True, + help="Input video file") + + (room_url, _, args) = await configure_with_args(session, parser) + + transport = DailyTransport( + room_url, + None, + "GStreamer", + DailyParams( + audio_out_enabled=True, + audio_out_is_live=True, + camera_out_enabled=True, + camera_out_width=1280, + camera_out_height=720, + camera_out_is_live=True, + ) + ) + + gst = GStreamerPipelineSource( + pipeline=f"filesrc location={args.input}", + out_params=GStreamerPipelineSource.OutputParams( + video_width=1280, + video_height=720, + audio_sample_rate=16000, + audio_channels=1, + ) + ) + + pipeline = Pipeline([ + gst, # GStreamer file source + transport.output(), # Transport bot output + ]) + + task = PipelineTask(pipeline) + + runner = PipelineRunner() + + await runner.run(task) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/foundational/18a-gstreamer-videotestsrc.py b/examples/foundational/18a-gstreamer-videotestsrc.py new file mode 100644 index 000000000..a107fbd5d --- /dev/null +++ b/examples/foundational/18a-gstreamer-videotestsrc.py @@ -0,0 +1,66 @@ +# +# Copyright (c) 2024, Daily +# +# SPDX-License-Identifier: BSD 2-Clause License +# + +import asyncio +import aiohttp +import argparse +import sys + +from pipecat.pipeline.pipeline import Pipeline +from pipecat.pipeline.runner import PipelineRunner +from pipecat.pipeline.task import PipelineTask +from pipecat.processors.gstreamer.pipeline_source import GStreamerPipelineSource +from pipecat.transports.services.daily import DailyParams, DailyTransport + +from runner import configure + +from loguru import logger + +from dotenv import load_dotenv +load_dotenv(override=True) + +logger.remove(0) +logger.add(sys.stderr, level="DEBUG") + + +async def main(): + async with aiohttp.ClientSession() as session: + (room_url, _) = await configure(session) + + transport = DailyTransport( + room_url, + None, + "GStreamer", + DailyParams( + camera_out_enabled=True, + camera_out_width=1280, + camera_out_height=720, + camera_out_is_live=True, + ) + ) + + gst = GStreamerPipelineSource( + pipeline="videotestsrc ! capsfilter caps=\"video/x-raw,width=1280,height=720\"", + out_params=GStreamerPipelineSource.OutputParams( + video_width=1280, + video_height=720, + ) + ) + + pipeline = Pipeline([ + gst, # GStreamer file source + transport.output(), # Transport bot output + ]) + + task = PipelineTask(pipeline) + + runner = PipelineRunner() + + await runner.run(task) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/foundational/runner.py b/examples/foundational/runner.py index 7242c4f27..068174eec 100644 --- a/examples/foundational/runner.py +++ b/examples/foundational/runner.py @@ -12,7 +12,15 @@ from pipecat.transports.services.helpers.daily_rest import DailyRESTHelper async def configure(aiohttp_session: aiohttp.ClientSession): - parser = argparse.ArgumentParser(description="Daily AI SDK Bot Sample") + (url, token, _) = await configure_with_args(aiohttp_session) + return (url, token) + + +async def configure_with_args( + aiohttp_session: aiohttp.ClientSession, + parser: argparse.ArgumentParser | None = None): + if not parser: + parser = argparse.ArgumentParser(description="Daily AI SDK Bot Sample") parser.add_argument( "-u", "--url", @@ -50,4 +58,4 @@ async def configure(aiohttp_session: aiohttp.ClientSession): token = await daily_rest_helper.get_token(url, expiry_time) - return (url, token) + return (url, token, args)