当前位置: 首页 > article >正文

使用 Flask 构建视频转 GIF 工具

使用 Flask 构建视频转 GIF 工具

在前几日的文章当中,我介绍了如何使用 Python 脚本将视频转化为 GIF 动画,为了更好、更方便的进行操作,在这篇博客中,我将介绍使用 Flask 框架创建一个简单的 Web 应用程序,该应用程序实现了之前的功能,即允许用户上传视频并将其转换为 GIF 动画。我们将使用 FFmpeg 工具进行视频处理,并提供一个友好的用户界面,方便用户进行操作。

项目概述

这个项目的目标是创建一个 Web 应用,用户可以通过它(之前的py脚本当中已经基本实现功能,只需要稍许修改 + 实现一个页面):

  1. 上传视频文件。
  2. 选择 GIF 动画的开始时间和持续时间。
  3. 下载生成的 GIF 动画。

环境准备

在开始之前,请确保你的环境中已安装以下组件:

  • Python
  • Flask
  • FFmpeg

你可以使用以下命令安装 Flask:

pip install Flask

同时,请确保 FFmpeg 已安装并可以在命令行中访问。

项目结构

首先,创建一个项目文件夹,目录结构如下:

your_project/
│
├── app.py                # Flask 应用
├── input_videos/        # 上传视频的文件夹
├── output_gifs/         # 输出 GIF 的文件夹
└── templates/
    └── index.html       # HTML 前端页面

Flask 应用代码

app.py 文件中,编写以下代码:

from flask import Flask, request, render_template, redirect, url_for, send_from_directory
import subprocess
import os

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = './input_videos/'
app.config['OUTPUT_FOLDER'] = './output_gifs/'

# 确保上传和输出文件夹存在
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
os.makedirs(app.config['OUTPUT_FOLDER'], exist_ok=True)

def convert_video_to_gif(input_video_path, output_gif_path, start_time, duration):
    command = [
        'ffmpeg',
        '-ss', str(start_time),
        '-t', str(duration),
        '-i', input_video_path,
        '-vf', 'fps=10,scale=320:-1:flags=lanczos',
        '-c:v', 'gif',
        output_gif_path
    ]
    subprocess.run(command)

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        video_file = request.files['video_file']
        start_time = request.form['start_time']
        duration = request.form['duration']
  
        if video_file:
            input_video_path = os.path.join(app.config['UPLOAD_FOLDER'], video_file.filename)
            output_gif_path = os.path.join(app.config['OUTPUT_FOLDER'], f"{os.path.splitext(video_file.filename)[0]}.gif")
            video_file.save(input_video_path)
            convert_video_to_gif(input_video_path, output_gif_path, start_time, duration)
            return redirect(url_for('send_gif', filename=f"{os.path.splitext(video_file.filename)[0]}.gif"))
  
    return render_template('index.html')

@app.route('/output_gifs/<filename>')
def send_gif(filename):
    return send_from_directory(app.config['OUTPUT_FOLDER'], filename)

if __name__ == '__main__':
    app.run(debug=True)

关键点

  • 在代码中,我们定义了一个函数 convert_video_to_gif,它使用 FFmpeg 将视频转换为 GIF。
  • / 路由中,我们处理文件上传和参数输入,并在转换后重定向到 GIF 下载链接。
  • 使用 send_from_directory 函数安全地提供生成的 GIF 文件。

HTML 前端页面

templates 文件夹中创建 index.html 文件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>视频转GIF工具</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
            background-color: #f4f4f4;
            color: #333;
        }
        .container {
            max-width: 600px;
            margin: 50px auto;
            padding: 20px;
            background: white;
            border-radius: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        h1 {
            text-align: center;
            color: #d53271;
        }
        input, button {
            margin: 10px 0;
            padding: 12px;
            width: 100%;
            border: 1px solid #ccc;
            border-radius: 5px;
            box-sizing: border-box;
        }
        button {
            background-color: #d53271;
            color: white;
            border: none;
            cursor: pointer;
        }
        button:hover {
            background-color: #91063a;
        }
        footer {
            text-align: center;
            margin-top: 20px;
        }
        footer p:hover {
            font-size: 1.7rem;
            color: #d53271;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>视频转GIF工具</h1>
        <form action="/" method="post" enctype="multipart/form-data">
            <input type="file" name="video_file" accept="video/*" required>
            <input type="number" name="start_time" placeholder="开始时间(秒)" required>
            <input type="number" name="duration" placeholder="持续时间(秒)" required>
            <button type="submit">转换为GIF</button>
        </form>
        <footer>
            <p>© 2025 无限大</p>
        </footer>
    </div>
</body>
</html>

运行应用

在终端中,导航到项目目录并运行 Flask 应用:

python app.py

打开浏览器并访问 http://127.0.0.1:5000/,你将看到一个友好的用户界面,可以上传视频并转换为 GIF(Flask框架默认端口号是5000)。

修改默认端口

如果您希望在不同的端口上运行您的应用,可以通过在 app.run() 中指定 port 参数来更改,例如:

if __name__ == '__main__':  
    app.run(debug=True, port=8080)  # 将端口改为 8080

这样,应用会在 http://127.0.0.1:8080/ 运行。

总结

通过这些步骤,我们成功创建了一个使用 Flask 和 FFmpeg 的视频转 GIF 工具。用户可以方便地上传视频,选择参数并下载生成的 GIF 文件。希望这个项目对你有所帮助,欢迎你根据自己的需求进行扩展和修改!如果在执行过程中有任何问题,欢迎随时询问。


http://www.kler.cn/a/512907.html

相关文章:

  • 学习ASP.NET Core的身份认证(基于JwtBearer的身份认证8)
  • Windows电脑桌面记录日程安排的提醒软件
  • 气膜料仓:工业仓储的高效与安全新选择—轻空间
  • AI 编程工具—Cursor AI 对话模式详解 内嵌对话模式
  • Unity Shader学习日记 part5 CG基础
  • 风吹字符起,诗意Linux:一场指令与自由的浪漫邂逅(上)
  • WinHttp API接口辅助类实现GET POST网络通讯
  • PostgreSQL的学习心得和知识总结(一百六十六)|深入理解PostgreSQL数据库之\watch元命令的实现原理
  • RabbitMq原生接口详解
  • C++编译时间可视化
  • 合并两个img栅格影像——arcgis
  • 解决GB28181对接RTSP倍速播放导致FFmpeg缓冲区满导致花屏问题
  • LangGraph:基于图结构的智能系统开发与实践
  • Java 大视界 -- 深入剖析 Java 在大数据内存管理中的优化策略(49)
  • 数据结构 链表1
  • 力扣hot100之螺旋矩阵
  • 深度学习篇---AnacondaLabelImg
  • Spring 6 第4章——原理:手写IoC
  • 《开源与合作:驱动鸿蒙Next系统中人工智能技术创新发展的双引擎》
  • STM32单片机学习记录(1.17)
  • Failed to load API definition
  • vue 如何判断每次进入都会刷新页面
  • 【WPF】WPF设置自定义皮肤主题
  • 数据结构初 - 链表
  • 第01章 11 分别使用DCMTK和gdcm库,解析DICOM文件系列的dicom标准数据信息
  • SpringBoot 搭建 SSE