Video Reverser Program in python - 25/03/2025

I have made a Video Reverser program in python. The program accepts MP4 and AVI video files, and outputs an AVI video file, which is the original video in reverse!

 

Make sure that you have cv2/openCV installed with your python installation ("https://pypi.org/project/opencv-python/" or "pip install opencv-python")

 

Hope you enjoy using it! Let me know of any questions or comments at makrypodisc@hotmail.com

:)

 

Python Code:

import cv2

import tkinter as tk

from tkinter import filedialog, messagebox, ttk

import threading

def reverse_video(input_path, output_path, progress_callback):

 cap = cv2.VideoCapture(input_path)

 if not cap.isOpened():

 progress_callback(0)

 messagebox.showerror("Error", "Failed to open video file.")

 return

 

 # Get video properties

 total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

 fps = cap.get(cv2.CAP_PROP_FPS)

 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

 height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

 

 # Total work is reading + writing frames (i.e., 2 * total_frames)

 total_work = 2 * total_frames

 processed_frames = 0

 

 # Read all frames

 frame_list = []

 while True:

 ret, frame = cap.read()

 if not ret:

 break

 frame_list.append(frame)

 processed_frames += 1

 # Update progress based on reading

 progress = (processed_frames / total_work) * 100

 progress_callback(progress)

 

 cap.release()

 

 # Write frames in reverse order

 fourcc = cv2.VideoWriter_fourcc(*'XVID')

 out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))

 for frame in reversed(frame_list):

 out.write(frame)

 processed_frames += 1

 # Update progress based on writing

 progress = (processed_frames / total_work) * 100

 progress_callback(progress)

 

 out.release()

 cv2.destroyAllWindows()

 progress_callback(100)

 messagebox.showinfo("Info", "Video reversed successfully.")

def browse_file(entry):

 file_path = filedialog.askopenfilename(filetypes=[("Video files", "*.mp4;*.avi")])

 entry.delete(0, tk.END)

 entry.insert(0, file_path)

def save_file(entry):

 file_path = filedialog.asksaveasfilename(defaultextension=".avi", filetypes=[("AVI files", "*.avi")])

 entry.delete(0, tk.END)

 entry.insert(0, file_path)

def start_reversing(input_entry, output_entry, progress_bar, reverse_button):

 input_path = input_entry.get()

 output_path = output_entry.get()

 if not input_path or not output_path:

 messagebox.showerror("Error", "Please select both input and output files.")

 return

 

 reverse_button.config(state=tk.DISABLED)

 progress_bar['value'] = 0

 def update_progress(value):

 progress_bar.after(0, lambda: progress_bar.config(value=value))

 

 def worker():

 reverse_video(input_path, output_path, update_progress)

 reverse_button.after(0, lambda: reverse_button.config(state=tk.NORMAL))

 

 threading.Thread(target=worker, daemon=True).start()

# GUI setup

root = tk.Tk()

root.title("Video Reverser")

input_label = tk.Label(root, text="Input Video:")

input_label.grid(row=0, column=0, padx=10, pady=5)

input_entry = tk.Entry(root, width=50)

input_entry.grid(row=0, column=1, padx=10, pady=5)

input_button = tk.Button(root, text="Browse", command=lambda: browse_file(input_entry))

input_button.grid(row=0, column=2, padx=10, pady=5)

output_label = tk.Label(root, text="Output Video:")

output_label.grid(row=1, column=0, padx=10, pady=5)

output_entry = tk.Entry(root, width=50)

output_entry.grid(row=1, column=1, padx=10, pady=5)

output_button = tk.Button(root, text="Save As", command=lambda: save_file(output_entry))

output_button.grid(row=1, column=2, padx=10, pady=5)

# Create and grid a progress bar widget

progress_bar = ttk.Progressbar(root, orient='horizontal', length=400, mode='determinate')

progress_bar.grid(row=2, column=0, columnspan=3, padx=10, pady=10)

reverse_button = tk.Button(root, text="Reverse Video", command=lambda: start_reversing(input_entry, output_entry, progress_bar, reverse_button))

reverse_button.grid(row=3, column=1, padx=10, pady=20)

root.mainloop()