使用 Flask 构建视频转 GIF 工具
在前几日的文章当中,我介绍了如何使用 Python 脚本将视频转化为 GIF 动画,为了更好、更方便的进行操作,在这篇博客中,我将介绍使用 Flask 框架创建一个简单的 Web 应用程序,该应用程序实现了之前的功能,即允许用户上传视频并将其转换为 GIF 动画。我们将使用 FFmpeg 工具进行视频处理,并提供一个友好的用户界面,方便用户进行操作。
项目概述
这个项目的目标是创建一个 Web 应用,用户可以通过它(之前的py脚本当中已经基本实现功能,只需要稍许修改 + 实现一个页面):
- 上传视频文件。
- 选择 GIF 动画的开始时间和持续时间。
- 下载生成的 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 文件。希望这个项目对你有所帮助,欢迎你根据自己的需求进行扩展和修改!如果在执行过程中有任何问题,欢迎随时询问。