Skip to content

Instantly share code, notes, and snippets.

@ionvision
Forked from laygond/writeVideoFromImages.py
Created June 25, 2021 08:02

Revisions

  1. @laygond laygond revised this gist Sep 11, 2019. No changes.
  2. @laygond laygond created this gist Sep 11, 2019.
    50 changes: 50 additions & 0 deletions writeVideoFromImages.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,50 @@
    #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")