广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何通过Python将MP4视频转换为GIF动画
  • 522
分享到

如何通过Python将MP4视频转换为GIF动画

2023-06-22 04:06:01 522人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章将为大家详细讲解有关如何通过python将MP4视频转换为GIF动画,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。运行环境你需要安装 OpenCV 绑定以读取 MP4 文件并将视频中的每一帧转换为

这篇文章将为大家详细讲解有关如何通过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 视频中提取帧

从 MP4 视频中提取帧的第一步是找到要转换为 GIF 的视频。

要从上面的视频中提取单个帧,你需要编写一些 Python。创建一个新文件并将其命名为mp4_converter.py。然后输入以下代码:

import cv2def 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 += 1if __name__ == "__main__":    convert_mp4_to_jpgs("flask_demo.mp4")

此代码采用 MP4 视频文件的路径。然后使用cv2.VideoCapture(path)打开视频。你可以使用此方法通读整个视频并提取每一帧。提取帧时,可以使用cv2.imwrite()将其写出。

当你运行这段代码时,你会发现这个 7 秒的视频产生了 235 帧!

现在准备好拍摄这些帧并将它们转换为动画 GIF。

将帧变成 GIF

该过程的下一步是将使用 OpenCV 从 MP4 文件中提取的帧转换为动画 GIF。

这就是 Pillow 包的用武之地。你可以使用它来接收图像文件夹并创建你的 GIF。打开一个新文件并将其命名为gif_maker.py。然后输入以下代码:

import globfrom PIL import Imagedef 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.

创建 MP4 到 GIF GUI

PySimpleGUI 是一个跨平台的 GUI 框架,可在 linuxMacwindows 上运行。它封装了 Tkinter、wxPython、PyQt 和其他几个 GUI 工具包,为它们提供了一个通用接口。

在本文前面安装 PySimpleGUI 时,你安装了包装 Tkinter 的默认版本。

打开一个新的 Python 文件并将其命名为mp4_converter_gui.py。然后将此代码添加到你的文件中:

# mp4_converter_gui.pyimport cv2import globimport osimport shutilimport PySimpleGUI as sgfrom PIL import Imagefile_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 += 1def 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.pyimport cv2import globimport osimport shutilimport PySimpleGUI as sgfrom PIL import Imagefile_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 的保存位置。

尝试运行此代码。你应该会看到如下内容:

如何通过Python将MP4视频转换为GIF动画

现在你拥有了将 MP4 视频文件转换为 GIF 所需的所有内容。你可以采取多种不同的措施来改进你的代码。例如,你可以向代码中添加更多错误处理,以免意外覆盖 GIF。

你还可以添加一些新的 UI 元素来告诉你的代码调整各个帧的大小以帮助缩小 GIF。另一种选择是更改每个单独的 JPG 的压缩,这也将减小 GIF 的大小。

还有很多其他有趣的方法可以使这段代码变得更好。考虑一下,你一定会自己想出一些新功能! 

关于“如何通过Python将MP4视频转换为GIF动画”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 如何通过Python将MP4视频转换为GIF动画

本文链接: https://www.lsjlt.com/news/302372.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 通过Python将MP4视频转换为GIF动画
    目录运行环境如何从 MP4 视频中提取帧将帧变成 GIF创建 MP4 到 GIF GUIPython 可用于读取常见的 MP4 视频格式并将其转换为 GIF动画。当然,如果你愿意,你...
    99+
    2022-11-12
  • 如何通过Python将MP4视频转换为GIF动画
    这篇文章将为大家详细讲解有关如何通过Python将MP4视频转换为GIF动画,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。运行环境你需要安装 OpenCV 绑定以读取 MP4 文件并将视频中的每一帧转换为...
    99+
    2023-06-22
  • Python如何将视频转换为图片
    Python如何将视频转换为图片,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言代码让人头秃,可是我喜欢上了代码的逻辑感和代码解决问题的力量。(我要对这个专题的图片进行修...
    99+
    2023-06-22
  • Python如何实现视频转换为字符画
    这篇文章给大家分享的是有关Python如何实现视频转换为字符画的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先读取视频,并转为字符。视频是从B站下载的,地址《激战江南》穿山甲名场面。由于B站直接下载的视频为fl...
    99+
    2023-06-22
  • 如何通过Python的pyttsx3库将文字转为音频
    目录前言一、pyttsx3是什么?二、安装pyttsx3三、查看pyttsx3版本四、pyttsx3的使用1.引入库2.定义需要转换的文本3.初始化pyttsx3引擎4.设置声音5....
    99+
    2023-05-16
    Python 文字转为音频 Python的pyttsx3库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作