Implement basic webrtc stream (#1054)

* implement basic webrtc_stream

* add aiortc to requirements.txt

* update aiortc version

* rename variables with rtc_ prefix

* changes

* changes

* change helper to assert_helper and stream_helper

* rename variables with rtc_ prefix

* add error handling

* return whole connection

* remove monkey patch and some cleaning

* cleanup

* tiny adjustments

* tiny adjustments

* proper typing and naming for rtc offer set

* - remove async from on_video_track method
- rename source -> target
- add audio

* audio always before video

---------

Co-authored-by: henryruhs <info@henryruhs.com>
This commit is contained in:
Harisreedhar
2026-03-17 14:02:40 +01:00
committed by henryruhs
co-authored by henryruhs
parent 9159f45a5f
commit ab24cd3f2e
34 changed files with 161 additions and 35 deletions
+31
View File
@@ -0,0 +1,31 @@
import asyncio
from typing import cast
from aiortc import MediaStreamTrack, RTCPeerConnection, VideoStreamTrack
from av import VideoFrame
from facefusion.streamer import process_stream_frame
def create_output_track(target_track : MediaStreamTrack) -> VideoStreamTrack:
output_track = VideoStreamTrack()
async def read_stream_frame() -> VideoFrame:
target_stream_frame = cast(VideoFrame, await target_track.recv())
output_vision_frame = await asyncio.get_running_loop().run_in_executor(None, process_stream_frame, target_stream_frame.to_ndarray(format = 'bgr24'))
output_stream_frame = VideoFrame.from_ndarray(output_vision_frame, format = 'bgr24')
output_stream_frame.pts = target_stream_frame.pts
output_stream_frame.time_base = target_stream_frame.time_base
return output_stream_frame
output_track.recv = read_stream_frame
return output_track
def on_video_track(rtc_connection : RTCPeerConnection, target_track : MediaStreamTrack) -> None:
if target_track.kind == 'audio':
rtc_connection.addTrack(target_track)
if target_track.kind == 'video':
output_track = create_output_track(target_track)
rtc_connection.addTrack(output_track)