您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何通過Python將MP4視頻轉換為GIF動畫,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
你需要安裝 OpenCV 綁定以讀取 MP4 文件并將視頻中的每一幀轉換為 JPG 文件。安裝教程:
python3 -m pip install opencv-python
你還需要Pillow從你從視頻中提取的 JPG 創建動畫 GIF。也可以用pip安裝:
python3 -m pip install Pillow
要創建 GUI,我這里會用到PySimpleGUI。要安裝該庫,請使用以下命令:
python3 -m pip install PySimpleGUI
如果你使用的是 Anaconda,則包含 opencv-python 和 Pillow。你只需要單獨安裝 PySimpleGUI。
從 MP4 視頻中提取幀的第一步是找到要轉換為 GIF 的視頻。
要從上面的視頻中提取單個幀,你需要編寫一些 Python。創建一個新文件并將其命名為mp4_converter.py
。然后輸入以下代碼:
import cv2 def convert_mp4_to_jpgs(path): video_capture = cv2.VideoCapture(path) 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 if __name__ == "__main__": convert_mp4_to_jpgs("flask_demo.mp4")
此代碼采用 MP4 視頻文件的路徑。然后使用cv2.VideoCapture(path)
打開視頻。你可以使用此方法通讀整個視頻并提取每一幀。提取幀時,可以使用cv2.imwrite()
將其寫出。
當你運行這段代碼時,你會發現這個 7 秒的視頻產生了 235 幀!
現在準備好拍攝這些幀并將它們轉換為動畫 GIF。
該過程的下一步是將使用 OpenCV 從 MP4 文件中提取的幀轉換為動畫 GIF。
這就是 Pillow
包的用武之地。你可以使用它來接收圖像文件夾并創建你的 GIF。打開一個新文件并將其命名為gif_maker.py
。然后輸入以下代碼:
import glob from PIL import Image def make_gif(frame_folder): images = glob.glob(f"{frame_folder}/*.jpg") images.sort() frames = [Image.open(image) for image in images] frame_one = frames[0] frame_one.save("flask_demo.gif", format="GIF", append_images=frames, save_all=True, duration=50, loop=0) if __name__ == "__main__": make_gif("output")
在這里,你使用 Python 的glob模塊在輸出文件夾中搜索 JPG 文件。然后對幀進行排序,使它們按正確的順序排列。最后,你將它們保存為 GIF.
PySimpleGUI 是一個跨平臺的 GUI 框架,可在 Linux、Mac 和 Windows 上運行。它封裝了 Tkinter、wxPython、PyQt 和其他幾個 GUI 工具包,為它們提供了一個通用接口。
在本文前面安裝 PySimpleGUI 時,你安裝了包裝 Tkinter 的默認版本。
打開一個新的 Python 文件并將其命名為mp4_converter_gui.py
。然后將此代碼添加到你的文件中:
# mp4_converter_gui.py import cv2 import glob import os import shutil import PySimpleGUI as sg from PIL import Image file_types = [("MP4 (*.mp4)", "*.mp4"), ("All files (*.*)", "*.*")] def convert_mp4_to_jpgs(path): video_capture = cv2.VideoCapture(path) still_reading, image = video_capture.read() frame_count = 0 if os.path.exists("output"): # remove previous GIF frame files shutil.rmtree("output") try: os.mkdir("output") except IOError: sg.popup("Error occurred creating output folder") return while still_reading: cv2.imwrite(f"output/frame_{frame_count:05d}.jpg", image) # read next image still_reading, image = video_capture.read() frame_count += 1 def make_gif(gif_path, frame_folder="output"): images = glob.glob(f"{frame_folder}/*.jpg") images.sort() frames = [Image.open(image) for image in images] frame_one = frames[0] frame_one.save(gif_path, format="GIF", append_images=frames, save_all=True, duration=50, loop=0) def main(): layout = [ [ sg.Text("MP4 File"), sg.Input(size=(25, 1), key="-FILENAME-", disabled=True), sg.FileBrowse(file_types=file_types), ], [ sg.Text("GIF File Save Location"), sg.Input(size=(25, 1), key="-OUTPUTFILE-", disabled=True), sg.SaveAs(file_types=file_types), ], [sg.Button("Convert to GIF")], ] window = sg.Window("MP4 to GIF Converter", layout) while True: event, values = window.read() mp4_path = values["-FILENAME-"] gif_path = values["-OUTPUTFILE-"] if event == "Exit" or event == sg.WIN_CLOSED: break if event in ["Convert to GIF"]: if mp4_path and gif_path: convert_mp4_to_jpgs(mp4_path) make_gif(gif_path) sg.popup(f"GIF created: {gif_path}") window.close() if __name__ == "__main__": main()
這是一段相當長的代碼。我們來一段一段分析。
要開始,請查看導入部分:
# mp4_converter_gui.py import cv2 import glob import os import shutil import PySimpleGUI as sg from PIL import Image file_types = [("MP4 (*.mp4)", "*.mp4"), ("All files (*.*)", "*.*")]
在這里,你導入創建 GUI 應用程序所需的所有模塊和包。這包括 OpenCV (cv2)、Pillow 的 Image clas 和 PySimpleGUI,以及許多 Python 自己的模塊。
你還創建了一個變量來保存可以加載到 GUI 中的文件類型。這是一個元組列表。
現在是時候將注意力轉向程序中的第一個函數:
def convert_mp4_to_jpgs(path): video_capture = cv2.VideoCapture(path) still_reading, image = video_capture.read() frame_count = 0 if os.path.exists("output"): # remove previous GIF frame files shutil.rmtree("output") try: os.mkdir("output") except IOError: sg.popup("Error occurred creating output folder") return while still_reading: cv2.imwrite(f"output/frame_{frame_count:05d}.jpg", image) # read next image still_reading, image = video_capture.read() frame_count += 1
這是你之前創建的 MP4 轉換器代碼的修改版本。在這個版本中,你仍然使用VideoCapture()來讀取 MP4 文件并將其轉換為單獨的幀。
但是,你還添加了一些額外的代碼來刪除“輸出”文件夾(如果存在)。這可以防止你意外地將兩個 MP4 文件合并到一個輸出文件中,這會導致 GIF 混亂。
你還添加了一些代碼來嘗試在刪除后創建“輸出”文件夾。如果創建文件夾時出現錯誤,則會顯示錯誤對話框。
其余代碼與之前相同。
現在你已準備好查看下一個函數:
def make_gif(gif_path, frame_folder="output"): images = glob.glob(f"{frame_folder}/*.jpg") images.sort() frames = [Image.open(image) for image in images] frame_one = frames[0] frame_one.save(gif_path, format="GIF", append_images=frames, save_all=True, duration=50, loop=0)
你可以使用make_gif()將幀文件夾轉換為 GIF 文件。此代碼與原始代碼幾乎相同,只是你傳入 GIF 文件的路徑以使其唯一。
最后一段代碼是你的 GUI 代碼:
def main(): layout = [ [ sg.Text("MP4 File"), sg.Input(size=(25, 1), key="-FILENAME-", disabled=True), sg.FileBrowse(file_types=file_types), ], [ sg.Text("GIF File Save Location"), sg.Input(size=(25, 1), key="-OUTPUTFILE-", disabled=True), sg.SaveAs(file_types=file_types), ], [sg.Button("Convert to GIF")], ] window = sg.Window("MP4 to GIF Converter", layout) while True: event, values = window.read() mp4_path = values["-FILENAME-"] gif_path = values["-OUTPUTFILE-"] if event == "Exit" or event == sg.WIN_CLOSED: break if event in ["Convert to GIF"]: if mp4_path and gif_path: convert_mp4_to_jpgs(mp4_path) make_gif(gif_path) sg.popup(f"GIF created: {gif_path}") window.close() if __name__ == "__main__": main()
在 PySimpleGUI 中,當你想在用戶界面中“布局”元素時,你可以將項目添加到 Python 列表中。對于此示例,你添加以下元素:
sg.Text - 此元素有兩個實例。它們用作輸入(文本框)的標簽
sg.Input - 這個元素有兩個實例,它是一個文本框類型的元素。一個保存 MP4 文件的位置,一個保存你要保存 GIF 的位置
sg.FileBrowse - 打開文件瀏覽對話框的按鈕
sg.SaveAs - 打開文件另存為對話框的按鈕
sg.Button - 一個可以做任何你想做的事情的按鈕
接下來,你獲取元素列表并將其傳遞給sg.Window,它表示包含所有其他元素的窗口。你的窗口還有一個退出按鈕、一個最小化按鈕和一個標題欄。
要啟動 GUI 的事件循環,你需要創建一個 while 循環并從 Window 對象中讀取數據。這允許你提取兩個sg.Input()對象的值,其中包含 MP4 和 GIF 文件的路徑。
當用戶按下標記為“轉換為 GIF”的按鈕時,你會捕獲該事件并調用convert_mp4_to_jpgs()和make_gif()。如果一切順利,視頻將被轉換,你將看到一個彈出對話框,說明新創建的 GIF 的保存位置。
嘗試運行此代碼。你應該會看到如下內容:
現在你擁有了將 MP4 視頻文件轉換為 GIF 所需的所有內容。你可以采取多種不同的措施來改進你的代碼。例如,你可以向代碼中添加更多錯誤處理,以免意外覆蓋 GIF。
你還可以添加一些新的 UI 元素來告訴你的代碼調整各個幀的大小以幫助縮小 GIF。另一種選擇是更改每個單獨的 JPG 的壓縮,這也將減小 GIF 的大小。
還有很多其他有趣的方法可以使這段代碼變得更好。考慮一下,你一定會自己想出一些新功能!
關于“如何通過Python將MP4視頻轉換為GIF動畫”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。