Spaces:
Running
Running
| 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() | |