import cv2 import gradio as gr import os from datetime import datetime import time import psutil def convert_to_grayscale(video_file, history): start_time = time.time() file_name = os.path.splitext(os.path.basename(video_file))[0] output_file = f"{file_name}_output.mp4" cap = cv2.VideoCapture(video_file) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = int(cap.get(cv2.CAP_PROP_FPS)) frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) video_duration = frame_count / fps fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter(output_file, fourcc, fps, (width, height), isColor=False) while(cap.isOpened()): ret, frame = cap.read() if not ret: break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray_flipped = cv2.flip(gray, 1) out.write(gray_flipped) cap.release() out.release() end_time = time.time() process_time = end_time - start_time current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") memory_usage = psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024 # in MB history.append(f"#{len(history)+1} {file_name} {current_time} {video_duration:.2f} {process_time:.2f} {memory_usage:.2f}") return output_file, history with gr.Blocks() as demo: history_state = gr.State([]) with gr.Tab("Convert Video"): with gr.Row(""): video_input = gr.Video(label="Upload Video", height=500, width=500) video_output = gr.Video(label="Grayscale Video", height=500, width=500) convert_button = gr.Button("Convert") convert_button.click( fn=convert_to_grayscale, inputs=[video_input, history_state], outputs=[video_output, history_state], show_progress=True ) with gr.Tab("History") as history_tab: history_output = gr.HTML(label="History") history_output.change( fn=lambda history: "" + "".join([f"" for entry in history]) + "
EntryFile NameCollected OnVideo DurationProcessing TimeMemory Usage
{entry.split()[0]}{entry.split()[1]}{entry.split()[2]+' '+entry.split()[3]}{entry.split()[4]} seconds{entry.split()[5]} seconds{entry.split()[6]} MB
", inputs=history_state, outputs=history_output, queue=False, show_progress=False ) demo.launch()