這是一個將影片轉變為表情包的工具,現實生活中當我們看到一段搞笑的影片,我們可以將這段影片餵給這段程式,生成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、實踐
這是成果的動圖:
也可以看到明顯的噪點
所以大家可以透過錄屏、爬蟲等方式,將原影片進行剪輯,投給這個程式,得到一個搞笑的表情包。去鬥圖吧!