diff --git a/facefusion/apis/stream_manager.py b/facefusion/apis/stream_manager.py index 62268ee7..aa7ac130 100644 --- a/facefusion/apis/stream_manager.py +++ b/facefusion/apis/stream_manager.py @@ -14,15 +14,13 @@ from facefusion.apis.stream_audio import receive_audio_frames, run_audio_encode_ from facefusion.apis.stream_video import receive_video_frames, run_video_encode_loop from facefusion.libraries import datachannel as datachannel_module from facefusion.types import AudioCodec, AudioFrame, BufferPack, PeerConnection, RtcPeer, RtcPeerAudio, SdpAnswer, SdpOffer, SessionId, Time, VideoCodec, VisionFrame -from facefusion.vision import read_static_images async def process_image(websocket : WebSocket) -> None: capture_vision_frame = await anext(receive_vision_frames(websocket), None) if numpy.any(capture_vision_frame): - source_vision_frames = read_static_images(state_manager.get_item('source_paths')) - output_vision_frame = streamer.process_stream_frame(source_vision_frames, capture_vision_frame) + output_vision_frame = streamer.process_stream_frame(capture_vision_frame) is_success, output_frame_buffer = cv2.imencode('.jpg', output_vision_frame) if is_success: diff --git a/facefusion/apis/stream_video.py b/facefusion/apis/stream_video.py index 810af061..ae502478 100644 --- a/facefusion/apis/stream_video.py +++ b/facefusion/apis/stream_video.py @@ -6,11 +6,10 @@ from typing import Optional, Tuple import cv2 import numpy -from facefusion import rtc, state_manager, streamer +from facefusion import rtc, streamer from facefusion.apis.stream_event import create_receive_event from facefusion.codecs import aom_decoder, aom_encoder, vpx_decoder, vpx_encoder from facefusion.types import AomDecoder, AomEncoder, BitRate, Buffer, BufferPack, Resolution, RtcPeer, RtcPeerVideo, Time, VideoCodec, VisionFrame, VpxDecoder, VpxEncoder -from facefusion.vision import read_static_images def run_video_encode_loop(rtc_peer : RtcPeer, video_queue : Queue[Tuple[Time, Future[BufferPack]]]) -> None: @@ -72,8 +71,7 @@ def receive_video_frames(rtc_peer_video : RtcPeerVideo, video_queue : Queue[Tupl def process_video_frame(input_vision_frame : VisionFrame) -> BufferPack: - source_vision_frames = read_static_images(state_manager.get_item('source_paths')) - output_vision_frame = streamer.process_stream_frame(source_vision_frames, input_vision_frame) + output_vision_frame = streamer.process_stream_frame(input_vision_frame) output_resolution : Resolution = (output_vision_frame.shape[1], output_vision_frame.shape[0]) output_buffer = cv2.cvtColor(output_vision_frame, cv2.COLOR_BGR2YUV_I420).tobytes() return BufferPack(buffer = output_buffer, resolution = output_resolution) diff --git a/facefusion/streamer.py b/facefusion/streamer.py index 413cf4dc..c663d9f8 100644 --- a/facefusion/streamer.py +++ b/facefusion/streamer.py @@ -2,7 +2,7 @@ import os import subprocess from collections import deque from concurrent.futures import ThreadPoolExecutor -from typing import Deque, Iterator, List +from typing import Deque, Iterator import cv2 import numpy @@ -14,13 +14,12 @@ from facefusion.content_analyser import analyse_stream from facefusion.ffmpeg import open_ffmpeg from facefusion.filesystem import is_directory from facefusion.processors.core import get_processors_modules -from facefusion.types import Fps, StreamMode, VisionFrame +from facefusion.types import Buffer, Fps, StreamMode, VisionFrame from facefusion.vision import extract_vision_mask, read_static_images def multi_process_capture(camera_capture : cv2.VideoCapture, camera_fps : Fps) -> Iterator[VisionFrame]: capture_deque : Deque[VisionFrame] = deque() - source_vision_frames = read_static_images(state_manager.get_item('source_paths')) with tqdm(desc = translator.get('streaming'), unit = 'frame', disable = state_manager.get_item('log_level') in [ 'warn', 'error' ]) as progress: with ThreadPoolExecutor(max_workers = state_manager.get_item('execution_thread_count')) as executor: @@ -32,7 +31,7 @@ def multi_process_capture(camera_capture : cv2.VideoCapture, camera_fps : Fps) - camera_capture.release() if numpy.any(capture_vision_frame): - future = executor.submit(process_stream_frame, source_vision_frames, capture_vision_frame) + future = executor.submit(process_stream_frame, capture_vision_frame) futures.append(future) for future_done in [ future for future in futures if future.done() ]: @@ -45,7 +44,8 @@ def multi_process_capture(camera_capture : cv2.VideoCapture, camera_fps : Fps) - yield capture_deque.popleft() -def process_stream_frame(source_vision_frames : List[VisionFrame], target_vision_frame : VisionFrame) -> VisionFrame: +def process_stream_frame(target_vision_frame : VisionFrame) -> VisionFrame: + source_vision_frames = read_static_images(state_manager.get_item('source_paths')) source_audio_frame = create_empty_audio_frame() source_voice_frame = create_empty_audio_frame() temp_vision_frame = target_vision_frame.copy() diff --git a/facefusion/workflows/core.py b/facefusion/workflows/core.py index fad5d486..0c28c912 100644 --- a/facefusion/workflows/core.py +++ b/facefusion/workflows/core.py @@ -86,9 +86,9 @@ def conditional_get_target_vision_frames(temp_frame_path : str, frame_number : i def process_temp_frame(temp_frame_path : str, frame_number : int) -> bool: reference_vision_frame = conditional_get_reference_vision_frame() source_vision_frames = read_static_images(state_manager.get_item('source_paths')) - target_vision_frames = conditional_get_target_vision_frames(temp_frame_path, frame_number) source_audio_frame = conditional_get_source_audio_frame(frame_number) source_voice_frame = conditional_get_source_voice_frame(frame_number) + target_vision_frames = conditional_get_target_vision_frames(temp_frame_path, frame_number) temp_vision_frame = read_static_image(temp_frame_path, 'rgba').copy() temp_vision_mask = extract_vision_mask(temp_vision_frame)