Home  >  Article  >  Backend Development  >  Using Python to convert MP4 and GIF formats is incredibly easy!

Using Python to convert MP4 and GIF formats is incredibly easy!

王林
王林forward
2023-04-12 19:58:141916browse

The last time I wrote an article on the official account, I encountered a problem. It was too cumbersome to insert video files into the official account. A very small video had to be reviewed when uploaded as a video to the platform, and it was not as straightforward as a GIF when played.

So I wanted to find a tool to convert mp4 to gif. After searching online, there are many online tools, but there are various methods. Some of them require advertisements, while others require you to scan a QR code first. Foreign websites are better, they don’t have so many tricks.

I think Python can definitely handle this kind of problem. After all, the omnipotent Python can do everything except not having children. In this way, I will make it into an online tool later, which is convenient for myself and can be used by others.

The principle of converting mp4 to gif is actually very simple, that is, reading the frames of the mp4 file and then merging them into a gif. You can easily get it done using the two libraries cv2 and PIL.

import glob

import cv2
from PIL import Image


def convert_mp4_to_jpgs(input_file):
# 先将mp4文件的所有帧读取出保存为图片
video_capture = cv2.VideoCapture(input_file)
still_reading, image = video_capture.read()
frame_count = 0
while still_reading:
cv2.imwrite(f"output/frame_{frame_count:03d}.jpg", image)
# read next image
still_reading, image = video_capture.read()
frame_count += 1


def convert_images_to_gif(output_file):
# 读取目录下图片,用Pillow模块的Image和所有图片合并
# 成一张gif
images = glob.glob(f"output/*.jpg")
images.sort()
frames = [Image.open(image) for image in images]
frame_one = frames[0]
frame_one.save(output_file, format="GIF", append_images=frames[1:],
 save_all=True, duration=40, loop=0)


def convert_mp4_to_gif(input_file, output_file):
convert_mp4_to_jpgs(input_file)
convert_images_to_gif(output_file)


if __name__ == "__main__":
convert_mp4_to_gif("demo.mp4", "output.gif")

After the execution is completed, it is found that the size of the gif file has increased sharply:

Using Python to convert MP4 and GIF formats is incredibly easy!

You can try to optimize the size of the gif by reducing the number of frames, such as This video has a total of 60 frames. If we only take 30 frames, the size will be halved;

frame_one.save(output_file, format="GIF", append_images=[f for i, f in enumerate(frames[1:]) if i % 2 == 0],
 save_all=True, duration=40, loop=0)

The implementation logic is to use the enumerate function to filter even-numbered pictures for synthesis, and the minimum size is compressed from 3.9M to 2M.

After writing this code, I found that there is another awesome library, moviepy, which can be done with just 2 lines of code;

def mp4_to_gif2():
clip = VideoFileClip("demo.mp4")
clip.write_gif("output2.gif")

moviepy has encapsulated the implementation details very simply, and then provided A large number of parameters can be configured by developers themselves. But the file converted using moviepy is 9M. I believe that parameters can be used to optimize and adjust it.

Using Python to convert MP4 and GIF formats is incredibly easy!

You have to admit that the Python ecosystem is full of libraries. There are all kinds of wheels. There is nothing you can’t do, only things you can’t find.

Of course, you can also convert gifs back to MP4 format. For example, if you see some funny gifs, convert them to mp4 and put them on the short video platform. They might become popular.

def convert_gif_to_mp4():
import moviepy.editor as mp
clip = mp.VideoFileClip("demo.gif")
clip.write_videofile("output.mp4")

Finally, if you know a little bit about operations, wouldn’t it be nice to make it into a tool and hang it online to become a fan-attracting artifact?

The above is the detailed content of Using Python to convert MP4 and GIF formats is incredibly easy!. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:51cto.com. If there is any infringement, please contact admin@php.cn delete