Terug

MP4 naar GIF converteerder

2024

Project

Voor de inspiratie van mijn portfolio website wilde ik een moodboard maken in Miro. Mijn grootste inspiratiebron was Instagram, waar ik veel afbeeldingen en video's had geliked. Deze media handmatig downloaden leek een onbegonnen taak.

Ik begon aan een webscraper. Helaas stuitte ik op problemen. Het downloaden van de laatste items in een reeks lukte niet, en video's opslaan was lastig. Afbeeldingen vormden geen probleem, maar video's waren een uitdaging.

Ik zocht een alternatief en ontdekte de mogelijkheid om een overzicht van mijn Instagram likes op te vragen als JSON-bestand. Dit bestand bevatte de URL's van alle media die ik had geliked. Met de bulk downloader WFdownloader kon ik vervolgens alle afbeeldingen en video's in één keer downloaden.

Een nieuw probleem ontstond. Miro ondersteunde geen MP4-video's, maar wel GIF's. Online converters waren een optie, maar vaak beperkt tot het verwerken van een klein aantal bestanden tegelijk of één voor één. Dit zou veel tijd kosten gezien de hoeveelheid van mijn gedownloade media.

Ik besloot mijn eigen video-naar-GIF converter te ontwikkelen. Dit gaf me controle over het proces en stelde me in staat om al mijn video's in één keer naar GIF te converteren. Het maakt gebruik van de ffmpeg bibliotheek.


Uitleg code:

  1. Imports:
import os
import subprocess
import glob
import multiprocessing
  1. Mappen Definiëren:
input_folder = r"map1"
output_folder = r"map2"

if not os.path.exists(output_folder):
    os.makedirs(output_folder)
  1. De convert_to_gif Functie:
def convert_to_gif(file_path):
    # Bepaal de naam van het output bestand
    base_name = os.path.basename(file_path)
    output_file = os.path.join(output_folder, f"{os.path.splitext(base_name)[0]}.gif")

    # Volledige pad naar ffmpeg.exe
    ffmpeg_path = r"locatie/download"  # Locatie waar je de ffmpeg hebt gedownload

    # Controleer of het GIF-bestand al bestaat
    if os.path.exists(output_file):
        print(f"{output_file} bestaat al. Sla over.")
        return  # Sla de conversie over als het bestand al bestaat

    # FFmpeg command
    command = [
        ffmpeg_path, '-i', file_path,
        '-vf', 'fps=10,scale=320:-1:flags=lanczos',
        '-c:v', 'gif',
        output_file
    ]

    # Voer het commando uit
    subprocess.run(command)
    print(f"Converted {file_path} to {output_file}")

De functie convert_to_gif(file_path) is verantwoordelijk voor de conversie van één MP4-videobestand naar een GIF-afbeelding. Hieronder volgt een stapsgewijze uitleg:

  1. Bestandsnaam bepalen:

  2. ffmpeg pad instellen:

  3. Controle op bestaand bestand:

  4. ffmpeg commando opbouwen:

  5. Commando uitvoeren en afronden:

  6. De main Functie:

def main():
    # Zoek naar MP4 bestanden in de input folder
    mp4_files = glob.glob(os.path.join(input_folder, '*.mp4'))

    # Gebruik multiprocessing om bestanden in bulk te converteren
    with multiprocessing.Pool() as pool:
        pool.map(convert_to_gif, mp4_files)

if __name__ == '__main__':
    main()

Deze functie orkestreert het gehele conversieproces.

Complete code:

import os
import subprocess
import glob
import multiprocessing

input_folder = r"map1"
output_folder = r"map2"

if not os.path.exists(output_folder):
    os.makedirs(output_folder)

def convert_to_gif(file_path):
    # Bepaal de naam van het output bestand
    base_name = os.path.basename(file_path)
    output_file = os.path.join(output_folder, f"{os.path.splitext(base_name)[0]}.gif")
    
    # Volledige pad naar ffmpeg.exe
    ffmpeg_path = r"locatie/download"  # Locatie waar je de ffmpeg hebt gedownload
    
    # Controleer of het GIF-bestand al bestaat
    if os.path.exists(output_file):
        print(f"{output_file} bestaat al. Sla over.")
        return  # Sla de conversie over als het bestand al bestaat

    # FFmpeg command
    command = [
        ffmpeg_path, '-i', file_path, 
        '-vf', 'fps=10,scale=320:-1:flags=lanczos', 
        '-c:v', 'gif', 
        output_file
    ]
    
    # Voer het commando uit
    subprocess.run(command)
    print(f"Converted {file_path} to {output_file}")

def main():
    # Zoek naar MP4 bestanden in de input folder
    mp4_files = glob.glob(os.path.join(input_folder, '*.mp4'))
    
    # Gebruik multiprocessing om bestanden in bulk te converteren
    with multiprocessing.Pool() as pool:
        pool.map(convert_to_gif, mp4_files)

if __name__ == '__main__':
    main()

---