Python 使用 OpenCV 将 MP4 转换为 GIF图

embedded/2024/11/26 0:24:55/

以下是使用 Python 和 OpenCV 将 MP4 转换为 GIF 的示例代码:

python

python">import cv2
import imageiodef mp4_to_gif(mp4_path, gif_path, fps=10, start_time=None, end_time=None):"""将MP4视频转换为GIF动图。:param mp4_path: 输入MP4视频的路径。:param gif_path: 输出GIF文件的路径。:param fps: GIF的帧率,默认值为10。:param start_time: 开始时间(秒),默认值为None,表示从视频开头开始转换。:param end_time: 结束时间(秒),默认值为None,表示转换到视频结尾。"""cap = cv2.VideoCapture(mp4_path)all_images = []frame_count = 0while True:ret, img = cap.read()if not ret:break# 根据开始时间和结束时间截取帧if start_time is not None and frame_count < start_time * fps:frame_count += 1continueif end_time is not None and frame_count >= end_time * fps:break# 将BGR图像转换为RGB格式,以适应imageio保存GIF的要求img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)all_images.append(img)frame_count += 1# 将帧率转换为每帧之间的延迟时间(毫秒)duration = int(1000 / fps)imageio.mimsave(gif_path, all_images, duration=duration)print("转换完成!")if __name__ == "__main__":input_mp4_path = "your_input_mp4.mp4"  # 替换为实际的输入MP4视频路径output_gif_path = "output.gif"  # 替换为输出GIF文件的路径start_time = 0  # 开始时间,单位:秒,可根据需要修改end_time = 5  # 结束时间,单位:秒,可根据需要修改fps = 15  # GIF的帧率,可根据需要修改mp4_to_gif(input_mp4_path, output_gif_path, fps=fps, start_time=start_time, end_time=end_time)

在上述代码中:

读取视频帧

  • 首先使用cv2.VideoCapture函数打开指定的 MP4 视频文件,并创建一个视频捕获对象cap2.
  • 通过一个循环不断读取视频的帧,使用cap.read()函数读取视频的下一帧图像。如果读取失败(视频结束),则跳出循环2.

截取特定时间段的帧

  • 根据提供的start_timeend_time参数来控制要转换的帧范围。如果start_time不为None,并且当前帧索引小于start_time乘以帧率的值,则跳过该帧。如果end_time不为None,并且当前帧索引大于等于end_time乘以帧率的值,则跳出循环2.

转换图像格式

  • 使用cv2.cvtColor函数将读取的图像帧从 BGR 格式转换为 RGB 格式,以便后续生成 GIF 图片时颜色显示正确2.

保存为 GIF

  • 将转换后的图像帧添加到all_images列表中。
  • 根据提供的帧率fps计算每帧之间的延迟时间duration,以便生成的 GIF 图片播放时具有指定的帧率2.
  • 使用imageio.mimsave函数将all_images列表中的帧保存为 GIF 图片。指定参数duration为帧间延迟时间。保存的 GIF 图片文件名由提供的gif_path参数决定2.

在运行代码之前,需要先安装opencv-pythonimageio库,可以通过pip install opencv-python imageio命令进行安装1. 同时,要将代码中的输入 MP4 视频路径、输出 GIF 文件路径、开始时间、结束时间和帧率等参数按照实际需求进行替换 。

效果如下


http://www.ppmy.cn/embedded/140510.html

相关文章

疑难Tips:NextCloud域名访问登录时卡住,显示违反内容安全策略

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 1使用域名访问Nextcloud用户登录时卡住,显示违反内容安全策略 我使用官方Docker镜像来部署NextCloud 28.0.5,并通过Openresty反向代理Nextcloud,但是在安装后无法稳定工作,每次登录后,页面会卡死在登录界面,无法…

设计模式-创建型-抽象工厂模式

1.概念 工厂方法模式只能生产一个产品系列&#xff0c;抽象工厂可以生产多个产品系列 2.作用 多个具体产品组成一个产品族&#xff08;产品系列&#xff09;&#xff0c;一个具体工厂负责生产一个产品族 3.应用场景 系统所需产品间由依赖关系&#xff0c;可以划分为同一产…

Java教程:SE进阶【十万字详解】(下)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

Linux——1_系统的延迟任务及定时任务

系统的延迟任务及定时任务 在系统中我们的维护工作大多数时在服务器行对闲置时进行 我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的&#xff0c;不会重复执行 当延迟任务产生输出后&#xff0c;这些输出会以邮件的形式发送给延迟任务发起者 在RHEL9中…

CSV文件数据导入hive

一、加载CSV文件数据到hive表步骤&#xff1a; 1、Hive上建表&#xff0c;通常会指定字段分隔符为逗号&#xff08;row format delimited fields terminated by ‘,’ &#xff09; 2、导入CSV文件 二、实操 以csv 文件中出现字段中含有逗号的场景为例&#xff1a;{“2020”…

Java基础-Java多线程机制

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…

区块链不可能三角

区块链不可能三角&#xff1a;探索去中心化、安全与可扩展性的权衡 引言 区块链技术自诞生以来&#xff0c;以其去中心化、透明、安全等特点吸引了全球的关注&#xff0c;成为金融科技领域的重要革新力量。然而&#xff0c;随着区块链应用的日益广泛&#xff0c;一个核心问题…

浏览器信任自定义https证书修改

浏览器信任自定义https证书修改 由于公司内部项目上要求平台使用https协议访问平台地址&#xff0c;并且使浏览器信任自定义HTTPS证书&#xff0c;因此可通过如下方式证书生成方式&#xff0c;并安装自定义生成证书做到浏览器信任自定义HTTPS证书。 通过openssl生成证书步骤如…