一個用Python將影片變為表情包的工具

yyy114發表於2024-04-30

這是一個將影片轉變為表情包的工具,現實生活中當我們看到一段搞笑的影片,我們可以將這段影片餵給這段程式,生成gif表情包,這樣就可以用來舍友鬥圖了

1、一些限制

1、這個程式不能轉化超過15秒以上的影片,因為佔用的記憶體較高,會被終端殺死(除非你的計算機效能很好,也許1分鐘的短影片都可以),為了整個程式的魯棒性,我就調成了15秒

2、轉化來的gif噪點畫質有顯著的下降,GIF 格式有顏色限制(通常為 256 色),可能不適合所有型別的影像內容,所以你可能會整出以下的陰間動圖

2、正片

 1 import cv2#匯入庫
 2 import sys
 3 import imageio
 4 
 5 def video_turn_gif(add):
 6     cap  = cv2.VideoCapture(add)#讀取影片
 7 
 8     video_frames = []#儲存幀資料
 9 
10     total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))#總共幀數
11     fps = cap.get(cv2.CAP_PROP_FPS)#幀率
12     time_total = total_frames/fps#總共時間
13 
14     if time_total <= 10:
15         while True:
16             ret, frame = cap.read()
17             if ret:
18                 video_frames.append(frame)#儲存影片幀資料
19             else:
20                 cap.release()#重置
21                 imageio.mimsave("test.gif", video_frames, duration=0.005)#將一幀一幀的影像併入gif,這是整個程式的點睛之筆
22                 print("finish!")
23                 sys.exit(1)
24     else:
25         print("太長了,老子不幹咯!")
26 
27 if __name__ == "__main__":
28     add_video = input("video_add......")#獲取影片地址
29     video_turn_gif(add_video)

我的思路是,透過cv2將影片分為一幀一幀的影像,將影像資訊存在一個列表裡,然後用imageio庫將這一幀一幀的影像合成一個gif檔案,儲存再結束程式。 cap.get(cv2.CAP_PROP_FRAME_COUNT) 用來獲取總共的幀數, cap.get(cv2.CAP_PROP_FPS) 用來獲取影片幀率,我們知道,影片時長=幀數/幀率,這樣我們就可以得到時間了,進而判斷影片是否超過15秒。 ret, frame = cap.read() 獲取影片的幀數,ret是一個布林值,代表著這一幀是否獲取,獲取則是True,沒獲取就是False,frame則是這一幀的影像資訊。mimsave函式專門儲存GIF或其他動畫格式的影像,其第一項為儲存的檔案地址,第二項為一個列表,存入每一幀影像資訊,duration=0.005設定GIF中每幀的持續時間為0.005s,也就是5ms

3、實踐

這是成果的動圖:

也可以看到明顯的噪點

所以大家可以透過錄屏、爬蟲等方式,將原影片進行剪輯,投給這個程式,得到一個搞笑的表情包。去鬥圖吧!

相關文章