import os import cv2 import gradio as gr from raft import Raft import yt_dlp def download_youtube_video(youtube_url, output_filename): ydl_opts = { 'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best', 'outtmpl': output_filename, } with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download([youtube_url]) def process_video(youtube_url, start_time, flow_frame_offset): model_path = 'raft_small_iter10_240x320.onnx' flow_estimator = Raft(model_path) output_filename = 'downloaded_video.mp4' processed_output = 'processed_video.mp4' # Download video if os.path.exists(output_filename): os.remove(output_filename) download_youtube_video(youtube_url, output_filename) cap = cv2.VideoCapture(output_filename) if not cap.isOpened(): return "Error: Could not open video." frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) fourcc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter(processed_output, fourcc, fps, (frame_width, frame_height)) cap.set(cv2.CAP_PROP_POS_FRAMES, start_time * fps) frame_list = [] frame_num = 0 while cap.isOpened(): ret, prev_frame = cap.read() if not ret: break frame_list.append(prev_frame) frame_num += 1 if frame_num <= flow_frame_offset: continue flow_map = flow_estimator(frame_list[0], frame_list[-1]) flow_img = flow_estimator.draw_flow() alpha = 0.5 combined_img = cv2.addWeighted(frame_list[0], alpha, flow_img, (1 - alpha), 0) if combined_img is None: break out.write(combined_img) frame_list.pop(0) cap.release() out.release() return processed_output examples = [ ["https://www.youtube.com/watch?v=is38pqgbj6A", 5, 50, "output_1.mp4"], ["https://www.youtube.com/watch?v=AdbrfoxiAtk", 0, 60, "output_2.mp4"], ["https://www.youtube.com/watch?v=vWGg0iPmI8k", 13, 70, "output_3.mp4"], ] with gr.Blocks() as app: gr.Markdown("### Optical Flow Video Processing\n" "Enter a YouTube URL, set the start time and flow frame offset, " "then click 'Process Video' to see the optical flow processing.") with gr.Row(): with gr.Column(): youtube_url = gr.Textbox(label="YouTube URL", placeholder="Enter YouTube Video URL Here") start_time = gr.Slider(minimum=0, maximum=60, label="Start Time (seconds)", step=1) flow_frame_offset = gr.Slider(minimum=1, maximum=100, label="Flow Frame Offset", step=1) submit_button = gr.Button("Process Video") with gr.Column(): output_video = gr.Video(label="Processed Video") submit_button.click( fn=process_video, inputs=[youtube_url, start_time, flow_frame_offset], outputs=output_video ) gr.Examples(examples=examples, inputs=[youtube_url, start_time, flow_frame_offset], fn=process_video, outputs=output_video, cache_examples=False) app.launch()