python实现 mp4转gif文件

python实现 mp4转gif文件

安装库:

bash 复制代码
pip install opencv-python imageio

实现python代码如下:

bash 复制代码
import cv2
import imageio
import numpy as np
import argparse
import os

def mp4_to_gif(mp4_path, gif_path=None, fps=None, scale=1.0, start=0, duration=None):
    """
    mp4 -> gif
    :param mp4_path: 输入视频
    :param gif_path: 输出路径,None 则同目录同名
    :param fps: 输出帧率,None 则与视频一致
    :param scale: 缩放因子,1.0 原尺寸,0.5 一半
    :param start: 起始时间(秒)
    :param duration: 截取时长(秒),None 表示到结尾
    """
    gif_path = gif_path or os.path.splitext(mp4_path)[0] + '.gif'

    cap = cv2.VideoCapture(mp4_path)
    vid_fps = cap.get(cv2.CAP_PROP_FPS)
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    w  = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    h  = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

    # 计算起止帧
    start_frame = int(start * vid_fps)
    if duration:
        end_frame = start_frame + int(duration * vid_fps)
    else:
        end_frame = total_frames
    end_frame = min(end_frame, total_frames)

    # 目标帧率
    out_fps = fps or vid_fps

    frames = []
    for idx in range(start_frame, end_frame):
        cap.set(cv2.CAP_PROP_POS_FRAMES, idx)
        ret, frame = cap.read()
        if not ret:
            break
        # BGR->RGB
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        # 缩放
        if scale != 1.0:
            frame = cv2.resize(frame, (int(w*scale), int(h*scale)),
                               interpolation=cv2.INTER_AREA)
        frames.append(frame)

    cap.release()

    if not frames:
        raise ValueError("未读取到任何帧,请检查截取区间")

    # 写 gif
    imageio.mimsave(gif_path, frames, fps=out_fps)
    print(f"gif 已保存 -> {gif_path}  共 {len(frames)} 帧  fps={out_fps}")


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("mp4", help="输入 mp4 文件")
    parser.add_argument("-o", "--output", help="输出 gif 路径")
    parser.add_argument("--fps", type=float, help="输出帧率")
    parser.add_argument("--scale", type=float, default=0.5, help="缩放因子,默认 0.5")
    parser.add_argument("--start", type=float, default=0, help="起始时间(秒)")
    parser.add_argument("--duration", type=float, help="截取时长(秒)")
    args = parser.parse_args()

    mp4_to_gif(args.mp4, args.output, args.fps, args.scale,
               args.start, args.duration)

实现指令:

bash 复制代码
python mp42gif.py demo.mp4 --scale 0.4 --fps 10 --start 5 --duration 3

实现示例效果如下:

相关推荐
f狐0狸x1 分钟前
【C++修炼之路】C++ list容器基本用法详解
开发语言·c++·list
坚持就完事了6 分钟前
Java的OOP
java·开发语言
计算机毕业编程指导师10 分钟前
大数据可视化毕设:Hadoop+Spark交通分析系统从零到上线 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·城市交通
jllllyuz10 分钟前
基于MATLAB的锂电池物理对象建模实现
开发语言·matlab
MyBFuture14 分钟前
C#数组详解:一维二维与交错数组
开发语言·windows·c#·visual studio·vision pro
计算机毕业编程指导师18 分钟前
【计算机毕设选题】基于Spark的车辆排放分析:2026年热门大数据项目 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·车辆排放
浔川python社23 分钟前
浔川社团关于产品数据情况的官方通告
python
生活很暖很治愈24 分钟前
GUI自动化测试[3]——控件&数鼠标操作
windows·python·功能测试·测试工具
程序 代码狂人31 分钟前
CentOS7初始化配置操作
linux·运维·开发语言·php
从此不归路33 分钟前
Qt5 进阶【13】桌面 Qt 项目架构设计:从 MVC/MVVM 到模块划分
开发语言·c++·qt·架构·mvc