import gradio as gr import cv2 # type: ignore import os from pathlib import Path import atexit current_dir = Path(__file__).resolve().parent def delete_files(): for p in Path(current_dir).glob("*.ts"): p.unlink() for p in Path(current_dir).glob("*.mp4"): p.unlink() atexit.register(delete_files) def process_video(input_video, stream_as_mp4): cap = cv2.VideoCapture(input_video) video_codec = cv2.VideoWriter_fourcc(*"mp4v") if stream_as_mp4 else cv2.VideoWriter_fourcc(*"x264") # type: ignore fps = int(cap.get(cv2.CAP_PROP_FPS)) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) iterating, frame = cap.read() n_frames = 0 n_chunks = 0 name = str(current_dir / f"output_{n_chunks}{'.mp4' if stream_as_mp4 else '.ts'}") segment_file = cv2.VideoWriter(name, video_codec, fps, (width, height)) # type: ignore while iterating: # flip frame vertically frame = cv2.flip(frame, 0) display_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) segment_file.write(display_frame) n_frames += 1 if n_frames == 3 * fps: n_chunks += 1 segment_file.release() n_frames = 0 yield name name = str( current_dir / f"output_{n_chunks}{'.mp4' if stream_as_mp4 else '.ts'}" ) segment_file = cv2.VideoWriter(name, video_codec, fps, (width, height)) # type: ignore iterating, frame = cap.read() segment_file.release() yield name with gr.Blocks() as demo: gr.Markdown("# Video Streaming Out 📹") with gr.Row(): with gr.Column(): input_video = gr.Video(label="input") checkbox = gr.Checkbox(label="Stream as MP4 file?", value=False) with gr.Column(): processed_frames = gr.Video( label="stream", streaming=True, autoplay=True, elem_id="stream_video_output", ) with gr.Row(): process_video_btn = gr.Button("process video") process_video_btn.click(process_video, [input_video, checkbox], [processed_frames]) gr.Examples( [ [ os.path.join( os.path.dirname(__file__), "video/compliment_bot_screen_recording_3x.mp4", ), False, ], [ os.path.join( os.path.dirname(__file__), "video/compliment_bot_screen_recording_3x.mp4", ), True, ], ], [input_video, checkbox], fn=process_video, outputs=processed_frames, cache_examples=False, ) if __name__ == "__main__": demo.launch()