You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.8 KiB
50 lines
1.8 KiB
2 months ago
|
from livekit.rtc import VideoStream
|
||
|
from livekit.agents import JobContext
|
||
|
from datetime import datetime
|
||
|
from livekit.agents.pipeline import VoicePipelineAgent
|
||
|
|
||
|
|
||
|
from livekit.rtc import VideoFrame
|
||
|
import asyncio
|
||
|
|
||
|
# Define the path to the log file
|
||
|
LOG_FILE_PATH = 'video_processor.txt'
|
||
|
|
||
|
def log_message(message: str):
|
||
|
"""Append a message to the log file with a timestamp."""
|
||
|
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||
|
with open(LOG_FILE_PATH, 'a') as log_file:
|
||
|
log_file.write(f"{timestamp} - {message}\n")
|
||
|
|
||
|
class RemoteVideoProcessor:
|
||
|
"""Processes video frames from a remote participant's video stream."""
|
||
|
|
||
|
def __init__(self, video_stream: VideoStream, job_ctx: JobContext):
|
||
|
self.video_stream = video_stream
|
||
|
self.job_ctx = job_ctx
|
||
|
self.current_frame = None # Store the latest VideoFrame
|
||
|
self.lock = asyncio.Lock()
|
||
|
|
||
|
|
||
|
async def process_frames(self):
|
||
|
log_message("Starting to process remote video frames.")
|
||
|
async for frame_event in self.video_stream:
|
||
|
try:
|
||
|
video_frame = frame_event.frame
|
||
|
timestamp = frame_event.timestamp_us
|
||
|
rotation = frame_event.rotation
|
||
|
|
||
|
# Store the current frame safely
|
||
|
log_message(f"Received frame: width={video_frame.width}, height={video_frame.height}, type={video_frame.type}")
|
||
|
async with self.lock:
|
||
|
self.current_frame = video_frame
|
||
|
|
||
|
except Exception as e:
|
||
|
log_message(f"Error processing frame: {e}")
|
||
|
|
||
|
async def get_current_frame(self) -> VideoFrame | None:
|
||
|
"""Retrieve the current VideoFrame."""
|
||
|
log_message("called get current frame")
|
||
|
async with self.lock:
|
||
|
log_message("retrieving current frame: " + str(self.current_frame))
|
||
|
return self.current_frame
|