使用 Flask 构建视频转 GIF 工具

使用 Flask 构建视频转 GIF 工具

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

项目概述

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

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

环境准备

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

  • Python
  • Flask
  • FFmpeg

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

bash 复制代码
pip install Flask

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

项目结构

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

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

Flask 应用代码

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

python 复制代码
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 文件

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 应用:

bash 复制代码
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 文件。希望这个项目对你有所帮助,欢迎你根据自己的需求进行扩展和修改!如果在执行过程中有任何问题,欢迎随时询问。

相关推荐
hakesashou18 分钟前
python如何导出数据到excel文件
开发语言·python·excel
Joker Zxc1 小时前
【Django】多个APP设置独立的URL
python·django·django的url
圣道寺1 小时前
审计文件标识作为水印打印在pdf页面边角
java·前端·python·pdf·学习方法
荣--1 小时前
Windows 快速启动器
python·alias
Edward-tan2 小时前
【玩转全栈】----Django模板的继承
后端·python·django
来自外太空的鱼-张小张2 小时前
阿里云oss简单获取视频第一帧工具类
windows·阿里云·音视频
算家云2 小时前
LatentSync本地部署教程:基于音频精准生成唇形高度同步视频
人工智能·音视频·模型部署·字节跳动·算家云·latentsync
折途2 小时前
I2S是什么通信协议?它如何传输音频数据?它和I2C是什么关系?
单片机·嵌入式硬件·物联网·音视频
安替-AnTi2 小时前
淘宝关键词页面爬取&绘图进行数据分析
python·信息可视化·关键词·爬取·tb
山海里啊有星辰2 小时前
Video-RAG:一种将视频RAG新框架
音视频