Adding support to define ice servers.

This commit is contained in:
Filipi Fuchter
2025-03-24 08:57:24 -03:00
parent 5184d178ef
commit 3be6973e2c
2 changed files with 12 additions and 4 deletions

View File

@@ -21,6 +21,8 @@ app = FastAPI()
# Store connections by pc_id # Store connections by pc_id
pcs_map: Dict[str, SmallWebRTCConnection] = {} pcs_map: Dict[str, SmallWebRTCConnection] = {}
ice_servers = ["stun:stun.l.google.com:19302"]
@app.post("/api/offer") @app.post("/api/offer")
async def offer(request: dict, background_tasks: BackgroundTasks): async def offer(request: dict, background_tasks: BackgroundTasks):
@@ -33,7 +35,7 @@ async def offer(request: dict, background_tasks: BackgroundTasks):
sdp=request["sdp"], type=request["type"], restart_pc=request.get("restart_pc", False) sdp=request["sdp"], type=request["type"], restart_pc=request.get("restart_pc", False)
) )
else: else:
pipecat_connection = SmallWebRTCConnection() pipecat_connection = SmallWebRTCConnection(ice_servers)
await pipecat_connection.initialize(sdp=request["sdp"], type=request["type"]) await pipecat_connection.initialize(sdp=request["sdp"], type=request["type"])
@pipecat_connection.on("closed") @pipecat_connection.on("closed")

View File

@@ -5,7 +5,7 @@ import uuid
from enum import Enum from enum import Enum
from typing import Any, Optional from typing import Any, Optional
from aiortc import RTCPeerConnection, RTCSessionDescription from aiortc import RTCConfiguration, RTCIceServer, RTCPeerConnection, RTCSessionDescription
from loguru import logger from loguru import logger
from pipecat.utils.event_emitter import EventEmitter from pipecat.utils.event_emitter import EventEmitter
@@ -18,15 +18,21 @@ class SignallingMessage(Enum):
class SmallWebRTCConnection(EventEmitter): class SmallWebRTCConnection(EventEmitter):
def __init__(self): def __init__(self, ice_servers=None):
super().__init__() super().__init__()
if ice_servers:
self.ice_servers = [RTCIceServer(urls=server) for server in ice_servers]
else:
self.ice_servers = []
self._is_connecting = False self._is_connecting = False
self._initialize() self._initialize()
def _initialize(self): def _initialize(self):
logger.info("Initializing new peer connection") logger.info("Initializing new peer connection")
rtc_config = RTCConfiguration(iceServers=self.ice_servers)
self.answer: Optional[RTCSessionDescription] = None self.answer: Optional[RTCSessionDescription] = None
self.pc = RTCPeerConnection() self.pc = RTCPeerConnection(rtc_config)
self.pc_id = "PeerConnection(%s)" % uuid.uuid4() self.pc_id = "PeerConnection(%s)" % uuid.uuid4()
self._setup_listeners() self._setup_listeners()
self._tracks = set() self._tracks = set()