首頁  >  文章  >  後端開發  >  用Python處理MP4與GIF格式互轉,簡單到爆!

用Python處理MP4與GIF格式互轉,簡單到爆!

王林
王林轉載
2023-04-12 19:58:141915瀏覽

上次公眾號寫文章的時候,遇到個問題,公眾號插入視頻文件太繁瑣,一個很小的視頻,作為視頻傳上去平台還要審核,播放的時候也沒gif來的直接。

於是想著找個工具將mp4轉換成gif。網路上搜一下,線上的工具好多,但是各種套路,有些重點廣告,有些要先掃二維碼。還是國外的網站好,沒那麼多套路。

我想Python肯定也可以處理這種問題,畢竟萬能的Python除了不會生孩子,什麼都能做。這樣後面我把它做成線上工具,方便自己也順便可以給其他人使用。

mp4轉gif的原理其實很簡單,就是將mp4檔案的影格讀出來,然後合併成一張gif圖。用cv2和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")

執行完成後,發現gif檔案大小暴增:

用Python處理MP4與GIF格式互轉,簡單到爆!

可以嘗試透過減少幀的數量來優化gif的大小,例如這個影片一共有60幀,我們只取30幀,大小就會減半;

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)

實作邏輯是用enumerate函數過濾取偶數張圖片來合成,最小大小從3.9M壓縮到2M。

寫完這個程式碼後,發現還有另一個牛逼的函式庫moviepy,2行程式碼就可以搞定;

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

moviepy把實作細節已經封裝非常簡約了,然後提供了一大堆參數可以讓開發者自行配置。但使用moviepy轉的檔案有9M,我相信可以用參數來優化調整。

用Python處理MP4與GIF格式互轉,簡單到爆!

你必須承認Python生態就是庫多,各式各樣的輪子都有,沒有做不到的,只有你找不到的。

當然,你也可以將gif轉回成MP4格式,例如你看到一些有趣的gif將它轉換成mp4放到短視頻平台,說不定就火了。

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

最後,如果你稍微懂點運營,把它做成工具,掛到網上,又是一個吸粉的神器,豈不美哉。

以上是用Python處理MP4與GIF格式互轉,簡單到爆!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除