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()