Skip to content

Instantly share code, notes, and snippets.

@ionvision
Forked from laygond/writeVideoFromImages.py
Created June 25, 2021 08:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ionvision/0169f7aefa9ba4d0206bf5db3cd761d8 to your computer and use it in GitHub Desktop.
Save ionvision/0169f7aefa9ba4d0206bf5db3cd761d8 to your computer and use it in GitHub Desktop.
Write Video from Images using MoviePy and OpenCV
#pip3 install -U imageio-ffmpeg # It contains VideoFileClip module and must be installed from shell
#from moviepy.editor import VideoFileClip,ImageSequenceClip # Must be added in the beginning with the rest of imported modules
# Define Input and Output folder (USER must Edit)
video_name = "sample.mp4"
video_name_part = video_name.split(".") # sample & mp4 has been split
input_video_path = os.path.join("Input_Video", video_name)
output_images_path = os.path.join("Output_Video", "Processed_Images") # This is a temporary folder to hold processed images
output_video_path = os.path.join("Output_Video", video_name_part[0] + "_output." + video_name_part[1])
# Load video
cap = cv2.VideoCapture(input_video_path)
# Get General Info
fps = cap.get(cv2.CAP_PROP_FPS) # OpenCV2 version 2 used "CV_CAP_PROP_FPS"
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
duration = int(frame_count/fps)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # float
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # float
# Apply some processing to each image and then save them
for frame_num in range(frame_count):
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_num)
_,frame=cap.read()
#Apply some processing here and then ...
image_path = os.path.join(output_images_path, "Frame_" + str(frame_num)+".jpg")
cv2.imwrite(image_path, frame)
# Order images according to frame number and file type in a list
IMAGE_EXT = ['jpeg', 'gif', 'png', 'jpg']
image_list = sorted(os.listdir(output_images_path), key=lambda a: int((a.split(".")[0]).split("_")[1])) # Order accord. to frame num
image_list = [os.path.join(output_images_path, image_file) for image_file in image_list] # Add directory path
image_list = [image_file for image_file in image_list if os.path.splitext(image_file)[1][1:].lower() in IMAGE_EXT] # Order accord. to file type
# Make video
clip = ImageSequenceClip(image_list, fps=fps)
clip.write_videofile(output_video_path)
# (OPTIONAL) Delete folder of Procesed Images
try:
shutil.rmtree(ouput_images_path)
except FileNotFoundError:
print ("Folder has been deleted already and Video is ready")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment