You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask中上传视频并通过FFmpeg转成480p MP4格式?

解决Flask视频上传后用FFmpeg转码为480p MP4的问题

你的现有代码仅完成了视频上传保存的功能,缺少调用FFmpeg转码的核心逻辑。下面是完整的解决方案:

步骤1:确认FFmpeg已安装

先在终端执行 ffmpeg -version,能正常输出版本信息说明已安装;如果没装,根据你的系统(Windows/macOS/Linux)安装对应版本即可。若FFmpeg不在系统PATH里,后续代码里要写它的绝对路径(比如Windows下"C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe")。

步骤2:修改上传视图函数,添加转码逻辑

在视频保存后,用Python的subprocess模块调用FFmpeg命令完成转码,同时处理转码失败的情况:

import subprocess
import os
from flask import request, redirect, render_template
from flask_login import login_required
from werkzeug.utils import secure_filename

@app.route("/upload", methods=["GET", "POST"])
@login_required
def upload():
    if request.method == "POST":
        if "video" not in request.files:
            print("上传出错:未找到视频文件")
            return redirect(request.url)
        video = request.files["video"]
        if video.filename == "":
            print("上传出错:未选择文件")
            return redirect(request.url)
        if video and filename_check(video.filename, type="video"):
            filename = secure_filename(video.filename)
            file_path = os.path.join(app.config["UPLOAD_FOLDER"], filename)
            video.save(file_path)
            print("文件上传成功")

            # 生成转码后的文件名(原文件名+_480p.mp4)
            base_name = os.path.splitext(filename)[0]
            output_filename = f"{base_name}_480p.mp4"
            output_path = os.path.join(app.config["UPLOAD_FOLDER"], output_filename)

            # FFmpeg核心转码命令:保持宽高比转480p,用H.264+AAC编码
            ffmpeg_cmd = [
                "ffmpeg",  # 若PATH没配置,替换成FFmpeg绝对路径
                "-i", file_path,
                "-vf", "scale=-2:480",  # -2自动匹配宽高比,避免变形
                "-c:v", "libx264",  # 兼容性最好的H.264视频编码
                "-crf", "23",  # 视频质量,0-51,越小质量越高文件越大
                "-c:a", "aac",  # AAC音频编码
                "-b:a", "128k",  # 音频比特率
                "-y",  # 直接覆盖同名输出文件,无需确认
                output_path
            ]

            try:
                # 执行转码命令,捕获输出信息
                result = subprocess.run(
                    ffmpeg_cmd,
                    capture_output=True,
                    text=True,
                    check=True
                )
                print("转码成功")
                print("FFmpeg输出:", result.stdout)

                # 可选:删除原上传文件,只保留转码后的文件
                # os.remove(file_path)

            except subprocess.CalledProcessError as e:
                print("转码失败")
                print("FFmpeg错误信息:", e.stderr)
                # 这里可以添加用户提示,比如返回错误页面或弹窗

            return redirect(request.url)
            
    return render_template("upload.html")

步骤3:修正init.py里的小错误

你的ALLOWED_IMAGE_EXTENTIONS写错成了视频格式,改成图片格式:

ALLOWED_IMAGE_EXTENTIONS = {"jpg", "jpeg", "png", "gif"}

内容的提问来源于stack exchange,提问作者goteki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:09:26