如何在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
相关产品推荐
相关产品推荐

